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