Почему SQL Server 2017 не распознает часовой пояс AT? - PullRequest
0 голосов
/ 17 января 2020

Я выполняю следующий запрос на базе данных SQL server 2017 (для разработчиков). запрос выполняется, но он показывает только значение getdate без фактического преобразования. Я также вижу, что "AT TIME ZONE" не выделен полностью синим цветом редактором SQL, что означает, что он, вероятно, не распознается. Любая идея, пожалуйста?

SELECT 
    GETDATE() AT TIME ZONE 'Central Europe Standard Time' as CET,
    GETDATE() AT TIME ZONE 'Cuba Standard Time' as 'Cuba Time'

PS: я проверил, что часовые пояса определены и написаны правильно

SELECT * FROM sys.time_zone_info 

1 Ответ

1 голос
/ 17 января 2020

Кажется, проблема в том, что вы неправильно понимаете, как AT TIME ZONE работает с типом данных datetime (что и возвращает GETDATE()). Возьмем следующее:

DECLARE @DT datetime = '2020-01-17T16:39:01.123';

SELECT @DT AT TIME ZONE 'Central Europe Standard Time' as CET,
       @DT AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];

Это возвращает следующее:

CET                                Cuba Time
---------------------------------- ----------------------------------
2020-01-17 16:39:01.123 +01:00     2020-01-17 16:39:01.123 -05:00

Обратите внимание, что время совпадает с тем, что было в @DT отдельно от часовой пояс. Это потому, что datetime не зависит от часового пояса; он не знает, что существует. В результате часовой пояс просто «добавляется» к значению.

Однако, если вы используете datetimeoffset, вы получите ожидаемый результат:

DECLARE @DT datetimeoffset(0) = '2020-01-17T16:39:01.123';

SELECT @DT AT TIME ZONE 'Central Europe Standard Time' as CET,
       @DT AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];

Возвращает:

CET                                Cuba Time
---------------------------------- ----------------------------------
2020-01-17 17:39:01 +01:00         2020-01-17 11:39:01 -05:00

В вашем случае это означает, что вместо этого вам нужно использовать SYSDATETIMEOFFSET:

SELECT SYSDATETIMEOFFSET() AT TIME ZONE 'Central Europe Standard Time' as CET,
       SYSDATETIMEOFFSET() AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];

Для меня, когда я пишу этот ответ, он возвращает следующее:

CET                                Cuba Time
---------------------------------- ----------------------------------
2020-01-17 17:43:55.5596303 +01:00 2020-01-17 11:43:55.5596303 -05:00
...