sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan konverteres et Unix-tidsstempel til en dato/tidsværdi i SQL Server

I SQL Server kan vi bruge følgende metode til at returnere en dato og tid baseret på et givet Unix-tidsstempel.

Unix-tidsstemplet (også kendt som Unix Epoch-tid, Unix-tid eller POSIX-tid) er det antal sekunder, der er gået siden 00:00:00 torsdag den 1. januar 1970, Coordinated Universal Time (UTC).

Eksempel

Her er et eksempel på at konvertere et Unix-tidsstempel til en dato/tidsværdi:

SELECT DATEADD(s, 1860935119, '1970-01-01');

Resultat:

2028-12-20 14:25:19.000

I dette tilfælde var unix-tidsstemplet 1860935119, hvilket er oversat til dato og klokkeslæt 2028-12-20 14:25:19.000.

Aktuel dato/klokkeslæt

Her er et eksempel, der bruger Unix-tidsstemplet baseret på den aktuelle dato/tid:

SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');

Resultat:

2022-04-18 00:31:46.000

Husk det er overflødigt, for vi kunne bare have gjort følgende:

SELECT GETUTCDATE();

Større Unix-tidsstempler

Når du står over for en større Unix-tidsstempelværdi som følgende:

SELECT DATEADD(s, 1867914562715876900, '1970-01-01');

Vi kunne få en overløbsfejl som denne:

Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.

Det er fordi Unix-tidsstempelværdien er større end hvad et heltal kan indeholde. Dette Unix-tidsstempel indeholder nanosekunds præcision og har for mange cifre til et heltal.

Vi har et par muligheder for at håndtere dette. En mulighed er at reducere præcisionen:

DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');

Resultat:

2029-03-11 09:09:22.000

Her brugte vi LEFT() funktion til kun at returnere de første ti cifre, samt CONVERT() funktion for at returnere et heltal.

Hvis vi ikke ønsker at reducere præcisionen, kan vi gøre sådan noget:

DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
    ns, 
    @ts % 1000000000, 
    DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
    );

Resultat:

2029-03-11 09:09:22.7158769

  1. Skal jeg oprette indekser på fremmednøgler på Oracle?

  2. Hvordan pakkes PL SQL-kode i Oracle?

  3. Brug af MySQL's IF EXISTS

  4. Tvetydig kolonnenavnsfejl på en bestemt server