Как я могу преобразовать bigint (UNIX timestamp) в datetime в SQL Server? - PullRequest
82 голосов
/ 25 мая 2010

Как преобразовать метку времени UNIX (bigint) в DateTime в SQL Server?

Ответы [ 12 ]

0 голосов
/ 17 сентября 2018

Добавление n секунд к 1970-01-01 даст вам UTC-дату , потому что n , метка времени Unix, равна количество секунд, прошедшее с 00:00:00 всемирного координированного времени (UTC), четверг, 1 января 1970 года .

В SQL Server 2016 вы можете конвертировать один часовой пояс в другой, используя AT TIME ZONE. Вам просто нужно знать название часового пояса в стандартном формате Windows:

SELECT *
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
CROSS APPLY (SELECT DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC') AS CA1(UTCDate)
CROSS APPLY (SELECT UTCDate AT TIME ZONE 'Pacific Standard Time') AS CA2(LocalDate)
| UnixTimestamp | UTCDate                    | LocalDate                  |
|---------------|----------------------------|----------------------------|
| 1514808000    | 2018-01-01 12:00:00 +00:00 | 2018-01-01 04:00:00 -08:00 |
| 1527854400    | 2018-06-01 12:00:00 +00:00 | 2018-06-01 05:00:00 -07:00 |

Или просто:

SELECT *, DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time'
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
| UnixTimestamp | LocalDate                  |
|---------------|----------------------------|
| 1514808000    | 2018-01-01 04:00:00 -08:00 |
| 1527854400    | 2018-06-01 05:00:00 -07:00 |

Примечания:

  • Вы можете отключить информацию о часовом поясе, применив DATETIMEOFFSET к DATETIME.
  • Преобразование учитывает переход на летнее время. Тихоокеанское время было UTC-08: 00 января 2018 года и UTC-07: 00 июня 2018 года.
0 голосов
/ 19 февраля 2013

лучше? Эта функция преобразует unixtime в миллисекундах в datetime. Потеряны миллисекунды, но все еще очень полезны для фильтрации.

CREATE FUNCTION [dbo].[UnixTimestampToGMTDatetime] 
(@UnixTimestamp bigint)
RETURNS datetime
AS
BEGIN
       DECLARE @GMTDatetime datetime
       select @GMTDatetime = 
       CASE
       WHEN dateadd(ss, @UnixTimestamp/1000, '1970-01-01') 
       BETWEEN 
           Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-03-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 4) % 7)) + ' 01:00:00', 20)
       AND
           Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-10-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 1) % 7)) + ' 02:00:00', 20)
       THEN Dateadd(hh, 1, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
       ELSE Dateadd(hh, 0, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
       END
RETURN @GMTDatetime    
END
...