Floco de neve CONVERT_TIMEZONE bug?

0

Pergunta

Em floco de Neve, quando a conversão de alguns locais, datas a UTC e, em seguida, de volta para o fuso horário do local usando CONVERT_TIMEZONE função, o resultado final é desativado por uma hora. Por exemplo:

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

Os resultados são:

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

Eu espero tanto DATE_LOCAL e DATE_LOCAL1 ser idênticos, no entanto DATE_LOCAL1 é uma hora. É este o esperado? Eu estou faltando alguma coisa ou há um erro no CONVERT_TIMEZONE função?

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

Melhor resposta

3

Isso não é um bug. Este é sobre a Hora de Verão (DST). Em 1949, a hora de verão começou a domingo, 24 de abril, 00:00. Então, quando você convertê-lo para UTC, torna-se 1949-04-24 05:00:00.0. Quando você convertê-lo de volta, ele se torna 01:00 por causa do horário de verão, porque é o momento em que os relógios eram viradas para a frente de uma hora.

2021-11-23 22:17:52

Você está certo, obrigado! Como explicado aqui: torontooldnews.wordpress.com/2018/08/14/daylight-savings-time "Em 1947, 1948 e 1949, por algum motivo, a cidade decidiu ajustar seus relógios para a frente e para trás, à meia-noite, em vez de 2." Veja também: timeanddate.com/time/change/canada/toronto?year=1949 Mas não deveria a conversão para UTC dar 1949-04-24 04:00:00 neste caso?
Leonard

De acordo com o meu entendimento, às 00:00 (antes da hora de verão começou a), o deslocamento TZ é UTC-5. Assim a conversão dá-05:00. Quando você convertê-lo de volta, o sistema usa o UTC-4 como sabemos que a hora de verão começou no Canadá/Leste.
Gokhan Atil

Obrigado pelo esclarecimento, @Gokhan Atil! Faz sentido agora. 1949-04-24 00:00:00 não é um tempo de validade (não existe), pois torna-se 1949-04-24 01:00:00. O mesmo se aplica a todos os momentos entre estes dois valores. Assim, o CONVERT_TIMEZONE função faz a conversão corretamente.
Leonard

Em outros idiomas

Esta página está em outros idiomas

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