В SQL Server можем да използваме следния метод, за да върнем дата и час въз основа на дадено времеви печат на Unix.
Unix timestamp (известен също като Unix Epoch time, Unix time или POSIX time) е броят на секундите, които са изминали от 00:00:00 четвъртък, 1 януари 1970 г., координирано универсално време (UTC).
Пример
Ето пример за преобразуване на времеви печат на Unix в стойност за дата/час:
SELECT DATEADD(s, 1860935119, '1970-01-01');
Резултат:
2028-12-20 14:25:19.000
В този случай клеймото за време на unix е 1860935119, което се превежда в дата и час 2028-12-20 14:25:19.000.
Текуща дата/час
Ето пример, който използва времевия печат на Unix въз основа на текущата дата/час:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Резултат:
2022-04-18 00:31:46.000
Имайте предвид, че това е излишно, защото можехме просто да направим следното:
SELECT GETUTCDATE();
По-големи Unix Timestamps
Когато се сблъскате с по-голяма стойност на времевия печат на Unix, като следното:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
Можем да получим грешка при препълване като тази:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Това е така, защото стойността на клеймото за време в Unix е по-голяма от това, което може да побере едно цяло число. Това клеймо за време на Unix съдържа наносекундна точност и има твърде много цифри за цяло число.
Имаме няколко варианта за справяне с това. Една от възможностите е да намалите точността:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Резултат:
2029-03-11 09:09:22.000
Тук използвахме LEFT()
функция за връщане само на първите десет цифри, както и CONVERT()
функция за връщане на цяло число.
Ако не искаме да намалим прецизността, можем да направим нещо подобно:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
Резултат:
2029-03-11 09:09:22.7158769