I SQL Server kan vi använda följande metod för att returnera ett datum och en tid baserat på en given Unix-tidsstämpel.
Unix-tidsstämpeln (även känd som Unix Epoch-tid, Unix-tid eller POSIX-tid) är antalet sekunder som har förflutit sedan 00:00:00 torsdagen den 1 januari 1970, Coordinated Universal Time (UTC).
Exempel
Här är ett exempel på att konvertera en Unix-tidsstämpel till ett datum-/tidsvärde:
SELECT DATEADD(s, 1860935119, '1970-01-01');
Resultat:
2028-12-20 14:25:19.000
I det här fallet var unix-tidsstämpeln 1860935119, vilket översattes till datum och tid 2028-12-20 14:25:19.000.
Aktuellt datum/tid
Här är ett exempel som använder Unix-tidsstämpeln baserat på aktuellt datum/tid:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Resultat:
2022-04-18 00:31:46.000
Tänk på att detta är överflödigt, eftersom vi bara kunde ha gjort följande:
SELECT GETUTCDATE();
Större Unix-tidsstämplar
När du står inför ett större Unix-tidsstämpelvärde som följande:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
Vi kan få ett overflow-fel som detta:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Det beror på att Unix-tidsstämpelvärdet är större än vad ett heltal kan hålla. Denna Unix-tidsstämpel innehåller nanosekundprecision och har för många siffror för ett heltal.
Vi har ett par alternativ för att hantera detta. Ett alternativ är att minska precisionen:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Resultat:
2029-03-11 09:09:22.000
Här använde vi LEFT()
funktion för att returnera bara de första tio siffrorna, samt CONVERT()
funktion för att returnera ett heltal.
Om vi inte vill minska precisionen kan vi göra något så här:
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