Sněhová vločka CONVERT_TIMEZONE chyba?

0

Otázka

V sněhová Vločka, při převodu některé místní data UTC a pak zpět do místní časové pásmo pomocí CONVERT_TIMEZONE funkce, výsledkem je vypnutí o jednu hodinu. Například:

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

Výsledky jsou:

DATE_LOCAL DATE_UTC DATE_LOCAL1
1949-04-24 00:00:00.0 1949-04-24 05:00:00.0 1949-04-24 01:00:00.0

Očekávám, že oba DATE_LOCAL a DATE_LOCAL1 být identické, nicméně DATE_LOCAL1 je jedna hodina pryč. Je to očekává? Uniká mi něco, nebo je chyba v CONVERT_TIMEZONE funkce?

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

Nejlepší odpověď

3

To není chyba. To je o Letní Čas (DST). V roce 1949, DST začal v neděli, 24. dubna, 00:00. Takže když si ji převést na UTC, To se stává 1949-04-24 05:00:00.0. Když si to převedu zpět, to se stává 01:00 protože DST, protože to je čas, který hodiny byly otočeny o jednu hodinu dopředu.

2021-11-23 22:17:52

Máte pravdu, děkuji! Jak je vysvětleno zde: torontooldnews.wordpress.com/2018/08/14/daylight-savings-time "V roce 1947, 1948 a 1949, z nějakého důvodu, rozhodl se město nastavit své hodiny dopředu a zpět o půlnoci, místo 2 hodin ráno." Viz také: timeanddate.com/time/change/canada/toronto?year=1949 Ale neměl by přepočet na UTC dát 1949-04-24 04:00:00 v tomto případě?
Leonard

Podle mého chápání, v 00:00 (před DST začal), TZ offset je UTC-5. Takže konverze dává 05:00. Když si to převedu zpět, systém používá UTC-4 protože víme, že letní čas začal v Kanadě/Východní.
Gokhan Atil

Děkuji za objasnění, @Gokhan Atil! Teď už to dává smysl. 1949-04-24 00:00:00 není platný čas (neexistuje), protože to se stává 1949-04-24 01:00:00. Totéž platí pro všechny časy mezi těmito dvěma hodnotami. To znamená, že CONVERT_TIMEZONE funkce konverze správně.
Leonard

V jiných jazycích

Tato stránka je v jiných jazycích

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