Ошибка ПРЕОБРАЗОВАНИЯ снежинки В ЧАСОВОЙ ПОЯС?

0

Вопрос

В Snowflake при преобразовании некоторых локальных дат в UTC, а затем обратно в локальный часовой пояс с помощью функции CONVERT_TIMEZONE конечный результат отключается на один час. Например:

ALTER SESSION SET TIMEZONE = 'Canada/Eastern';
select
cast('1949-04-24' as timestamp) as date_local -- because TIMEZONE = 'Canada/Eastern'
, convert_timezone('Canada/Eastern', 'UTC', '1949-04-24') as date_utc
, convert_timezone('UTC', 'Canada/Eastern', convert_timezone('Canada/Eastern', 'UTC', '1949-04-24')) as date_local1

Результаты таковы:

ДАТА_ЛОКАЛЬНАЯ ДАТА _UTC DATE_LOCAL1
1949-04-24 00:00:00.0 1949-04-24 05:00:00.0 1949-04-24 01:00:00.0

Я ожидаю, что и DATE_LOCAL, и DATE_LOCAL1 будут идентичны, однако DATE_LOCAL1 отключен на один час. Ожидается ли это? Я что-то упускаю или в функции CONVERT_TIMEZONE есть ошибка?

snowflake-cloud-data-platform
2021-11-23 21:46:09
1

Лучший ответ

3

Это не ошибка. Речь идет о переходе на летнее время (DST). В 1949 году летнее время началось в воскресенье, 24 апреля, в 00:00. Поэтому, когда вы преобразуете его в UTC, он становится 1949-04-24 05:00:00.0. Когда вы конвертируете его обратно, он становится 01:00 из-за летнего времени, потому что это время, когда часы были переведены на один час вперед.

2021-11-23 22:17:52

Вы правы, спасибо вам! Как объясняется здесь: torontooldnews.wordpress.com/2018/08/14/daylight-savings-time "В 1947, 1948 и 1949 годах по какой-то причине город решил перевести свои часы вперед и назад в полночь вместо 2 часов ночи" См. Также: timeanddate.com/time/change/canada/toronto?year=1949 Но разве в этом случае преобразование в UTC не должно давать 1949-04-24 04:00:00?
Leonard

Согласно моему пониманию, в 00:00 (до начала летнего времени) смещение TZ равно UTC-5. Итак, преобразование дает 05:00. Когда вы конвертируете его обратно, система использует UTC-4, поскольку мы знаем, что летнее время началось в Канаде/Восточной части.
Gokhan Atil

Спасибо за разъяснение, @Gokhan Atil! Теперь это имеет смысл. 1949-04-24 00:00:00 не является допустимым временем (не существует), так как оно становится 1949-04-24 01:00:00. То же самое относится ко всем временам между этими двумя значениями. Таким образом, функция CONVERT_TIMEZONE выполняет преобразование правильно.
Leonard

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории