W SQL Server możemy użyć następującej metody, aby zwrócić datę i godzinę na podstawie podanego uniksowego znacznika czasu.
Sygnatura czasowa uniksa (znana również jako czas epoki uniksowej, czas uniksowy lub czas POSIX) to liczba sekund, które upłynęły od godziny 00:00:00 w czwartek, 1 stycznia 1970 r., uniwersalny czas koordynowany (UTC).
Przykład
Oto przykład konwersji uniksowego znacznika czasu na wartość daty/czasu:
SELECT DATEADD(s, 1860935119, '1970-01-01');
Wynik:
2028-12-20 14:25:19.000
W tym przypadku uniksowy znacznik czasu to 1860935119, co oznacza datę i godzinę 2028-12-20 14:25:19.000.
Aktualna data/godzina
Oto przykład, który używa uniksowego znacznika czasu na podstawie bieżącej daty/godziny:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Wynik:
2022-04-18 00:31:46.000
Pamiętaj, że jest to zbyteczne, ponieważ mogliśmy po prostu wykonać następujące czynności:
SELECT GETUTCDATE();
Większe sygnatury czasowe systemu Unix
W obliczu większej wartości sygnatury czasowej uniksowej, takiej jak poniżej:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
Możemy otrzymać taki błąd przepełnienia:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Dzieje się tak, ponieważ wartość znacznika czasu uniksowego jest większa niż liczba całkowita. Ten uniksowy znacznik czasu ma precyzję nanosekundową i zawiera zbyt wiele cyfr dla liczby całkowitej.
Mamy kilka możliwości radzenia sobie z tym. Jedną z opcji jest zmniejszenie precyzji:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Wynik:
2029-03-11 09:09:22.000
Tutaj użyliśmy LEFT()
funkcja zwracająca tylko pierwsze dziesięć cyfr, a także funkcję CONVERT()
funkcja zwracająca liczbę całkowitą.
Jeśli nie chcemy zmniejszać precyzji, możemy zrobić coś takiego:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
Wynik:
2029-03-11 09:09:22.7158769