Кажется, проблема в том, что вы неправильно понимаете, как 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