Eu estava respondendo a essa pergunta do stackoverflow e encontrei um resultado estranho:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
e próxima consulta
select id,
timestampwithtimezone,
timestampwithtimezone at time zone 'Europe/Berlin' as berlin,
timestampwithtimezone at time zone 'CET' as cet
from data ;
id | timestampwithtimezone | berlin | cet
-----+------------------------+---------------------+---------------------
205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 | 2012-10-28 00:30:00
204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
203 | 2012-10-28 02:30:00+02 | 2012-10-28 02:30:00 | 2012-10-28 01:30:00
202 | 2012-10-28 02:59:59+02 | 2012-10-28 02:59:59 | 2012-10-28 01:59:59
106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00
Estou usando o PostgreSQL 9.1.2 e o ubuntu 12.04.
Apenas verifiquei que no resultado 8.2.11 é o mesmo.
De acordo com a documentação , não importa se eu uso nome ou abreviação.
Isso é um inseto?
Estou fazendo algo errado?
Alguém pode explicar esse resultado?
EDIT Pelo comentário de que a CET não é a Europa / Berlim.
Estou apenas selecionando valores de pg_timezone_names.
select * from pg_timezone_names where abbrev ='CEST';
name | abbrev | utc_offset | is_dst
------+--------+------------+--------
e
select * from pg_timezone_names where abbrev ='CET';
name | abbrev | utc_offset | is_dst
---------------------+--------+------------+--------
Africa/Tunis | CET | 01:00:00 | f
Africa/Algiers | CET | 01:00:00 | f
Africa/Ceuta | CET | 01:00:00 | f
CET | CET | 01:00:00 | f
Atlantic/Jan_Mayen | CET | 01:00:00 | f
Arctic/Longyearbyen | CET | 01:00:00 | f
Poland | CET | 01:00:00 | f
.....
Durante o inverno, a Europa / Berlim é +01. Durante o verão é +02.
EDIT2
Em 28/10/2012, o fuso horário mudou de horário de verão para o inverno às 2:00.
Esses dois registros têm o mesmo valor na Europa / Berlim:
204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00
Isso sugere que, se eu usar uma das abreviações (CET ou CEST) para o resultado do grande intervalo de dados (horário de verão e inverno), estará errado para alguns dos registros. Vai ser bom se eu usar 'Europa / Berlim'.
Alterei a hora do sistema para '2012-01-17' e pg_timezone_names também mudou.
select * from pg_timezone_names where name ='Europe/Berlin';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CEST | 02:00:00 | t
CET
é - pelo menos não durante os horários de verão. Europe/Berlin
2012-10-28 01:30:00
é CEST, não CET.