Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да конвертирате Unix Timestamp в стойност на дата/час в SQL Server

В 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте „datetime2“ в „time“ в SQL Server (T-SQL примери)

  2. Подобрете настройката на производителността на SQL Server с тези 3 съвета

  3. Как да преименувате ограничение на първичния ключ за множество таблици в база данни на SQL Server - SQL Server / TSQL урок, част 64

  4. TSQL Pivot без агрегатна функция

  5. Планирано изпълнение на съхранената процедура на SQL сървър