Błąd KONWERSJI płatki śniegu W STREFA CZASOWA?

0

Pytanie

W Snowflake podczas konwertowania niektórych lokalnych dat w UTC, a następnie z powrotem do lokalnej strefy czasowej przy użyciu funkcji CONVERT_TIMEZONE końcowy wynik wyłącza na godzinę. Na przykład:

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

Wyniki są następujące:

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

Spodziewam się, że i DATE_LOCAL, i DATE_LOCAL1 będą identyczne, jednak DATE_LOCAL1 wyłączony na godzinę. Oczekuje się, czy to? -Coś mi umknęło lub w funkcji CONVERT_TIMEZONE jest błąd?

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

Najlepsza odpowiedź

3

To nie jest błąd. Chodzi o przejściu na czas letni (DST). W 1949 roku latem rozpoczęła się w niedzielę, 24 kwietnia, o godzinie 00:00. Dlatego, gdy przekształcisz go w UTC, staje się 1949-04-24 05:00:00.0. Gdy konwertujesz go z powrotem, staje 01:00 z powodu czasu letniego, bo to czas, kiedy zegar zostały przetłumaczone na jedną godzinę do przodu.

2021-11-23 22:17:52

Masz rację, dziękuję ci! Jak wyjaśniono tutaj: torontooldnews.wordpress.com/2018/08/14/daylight-savings-time "W 1947, 1948 i 1949 roku, z jakiegoś powodu, miasto postanowił przenieść swój zegarek do przodu i do tyłu o północy zamiast 2 godzin w nocy" Cm. Również: timeanddate.com/time/change/canada/toronto?year=1949 Ale czy w tym przypadku konwersja w UTC nie powinno się podawać 1949-04-24 04:00:00?
Leonard

Według mojego zrozumienia, o 00:00 (do początku czasu letniego) przesunięcie TZ tak UTC-5. Tak więc, konwersja daje 05:00. Gdy konwertujesz go z powrotem, system używa UTC-4, ponieważ wiemy, że latem rozpoczęła się w Kanadzie/Wschodniej części.
Gokhan Atil

Dziękuję za wyjaśnienie, @Gokhan Atil! Teraz to ma sens. 1949-04-24 00:00:00 nie jest prawidłowym czasem (nie istnieje), ponieważ staje się 1949-04-24 01:00:00. To samo odnosi się do wszystkich czasów pomiędzy tymi dwoma wartościami. W ten sposób funkcja CONVERT_TIMEZONE wykonuje konwersja poprawnie.
Leonard

W innych językach

Ta strona jest w innych językach

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