Fulg de nea CONVERT_TIMEZONE bug?

0

Problema

În Fulg de nea, atunci când conversia locale datează de la UTC și apoi înapoi la zona de fus orar local folosind CONVERT_TIMEZONE funcție, rezultatul final este oprit cu o oră. De exemplu:

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

Rezultatele sunt:

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

Mă aștept ca ambele DATE_LOCAL și DATE_LOCAL1 să fie identice, cu toate acestea DATE_LOCAL1 este de o oră. Acest lucru este așteptat? Am pierdut ceva sau nu există un bug în CONVERT_TIMEZONE funcție?

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

Cel mai bun răspuns

3

Acesta nu este un bug. Este vorba despre Daylight Saving Time (DST). În 1949, ora de VARĂ a început duminică, 24 aprilie, ora 00:00. Deci, atunci când se converti la UTC, devine 1949-04-24 05:00:00.0. Când convertiți-l înapoi, ea devine 01:00 din cauza DST, pentru că e momentul în care ceasurile au fost întoarse cu o oră înainte.

2021-11-23 22:17:52

Ai dreptate, multumesc! Așa cum sa explicat aici: torontooldnews.wordpress.com/2018/08/14/daylight-savings-time "În 1947, 1948, 1949 și, pentru unii motiv, primăria a decis să își stabilească ceasuri înainte și înapoi, la miezul nopții, în loc de 2. m." se Vedea, de asemenea: timeanddate.com/time/change/canada/toronto?year=1949 Dar n-ar trebui conversia la UTC da 1949-04-24 04:00:00, în acest caz?
Leonard

În conformitate cu înțelegerea mea, la ora 00:00 (inainte de DST început), TZ offset este UTC-5. Atât de conversie oferă 05:00. Atunci când conversia înapoi, sistemul utilizează UTC-4 după cum știm că DST început în Canada/de Est.
Gokhan Atil

Multumesc pentru clarificare, @Gokhan Atil! Acum are sens. 1949-04-24 00:00:00 nu este valabil timp (nu există), deoarece acesta devine 1949-04-24 01:00:00. Același lucru se aplică la toate ori între aceste două valori. Astfel, CONVERT_TIMEZONE funcția face conversia în mod corect.
Leonard

În alte limbi

Această pagină este în alte limbi

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