In SQL Server kunnen we de volgende methode gebruiken om een datum en tijd te retourneren op basis van een gegeven Unix-tijdstempel.
De Unix-tijdstempel (ook bekend als Unix Epoch-tijd, Unix-tijd of POSIX-tijd) is het aantal seconden dat is verstreken sinds 00:00:00 donderdag 1 januari 1970 Coordinated Universal Time (UTC).
Voorbeeld
Hier is een voorbeeld van het converteren van een Unix-tijdstempel naar een datum/tijd-waarde:
SELECT DATEADD(s, 1860935119, '1970-01-01');
Resultaat:
2028-12-20 14:25:19.000
In dit geval was de Unix-tijdstempel 1860935119, wat zich vertaalde in een datum en tijd van 2028-12-20 14:25:19.000.
Huidige datum/tijd
Hier is een voorbeeld dat de Unix-tijdstempel gebruikt op basis van de huidige datum/tijd:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Resultaat:
2022-04-18 00:31:46.000
Let wel, dit is overbodig, want we hadden gewoon het volgende kunnen doen:
SELECT GETUTCDATE();
Grotere Unix-tijdstempels
Wanneer geconfronteerd met een grotere Unix-tijdstempelwaarde zoals de volgende:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
We kunnen een overloopfout krijgen zoals deze:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Dat komt omdat de Unix-tijdstempelwaarde groter is dan wat een geheel getal kan bevatten. Deze Unix-tijdstempel bevat een precisie van nanoseconden en heeft te veel cijfers voor een geheel getal.
We hebben een aantal opties om hiermee om te gaan. Een optie is om de precisie te verminderen:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Resultaat:
2029-03-11 09:09:22.000
Hier gebruikten we de LEFT()
functie om alleen de eerste tien cijfers terug te geven, evenals de CONVERT()
functie om een geheel getal terug te geven.
Als we de precisie niet willen verminderen, kunnen we zoiets als dit doen:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
Resultaat:
2029-03-11 09:09:22.7158769