Estaba respondiendo a esta pregunta de stackoverflow y encontré un resultado extraño:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
y siguiente 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
Estoy usando PostgreSQL 9.1.2 y ubuntu 12.04.
Acabo de comprobar que en 8.2.11 el resultado es el mismo.
Según la documentación , no importa si uso el nombre o la abreviatura.
¿Es esto un error?
¿Estoy haciendo algo mal?
¿Alguien puede explicar este resultado?
EDITAR Para el comentario de que CET no es Europa / Berlín.
Solo estoy seleccionando valores de pg_timezone_names.
select * from pg_timezone_names where abbrev ='CEST';
name | abbrev | utc_offset | is_dst
------+--------+------------+--------
y
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 el invierno Europa / Berlín es +01. Durante el verano es +02.
EDITAR2
En el 28/10/2012, la zona horaria ha cambiado del horario de verano al horario de invierno a las 2:00.
Estos dos registros tienen el mismo valor en Europa / Berlín:
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
Esto sugiere que si uso una de las abreviaturas (CET o CEST) para el rango de datos grandes (horario de verano e invierno), el resultado será incorrecto para algunos de los registros. Será bueno si uso 'Europa / Berlín'.
Cambié la hora del sistema a '2012-01-17' y pg_timezone_names también ha cambiado.
select * from pg_timezone_names where name ='Europe/Berlin';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CEST | 02:00:00 | t
CET
es , al menos no durante el horario de verano. Europe/Berlin
2012-10-28 01:30:00
es CEST, no CET.