Je répondais à cette question de stackoverflow et j'ai trouvé un résultat étrange:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
et la requête suivante
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
J'utilise PostgreSQL 9.1.2 et Ubuntu 12.04.
Je viens de vérifier que le résultat du 8.2.11 est le même.
Selon la documentation , peu importe si j'utilise un nom ou une abréviation.
Est-ce un bug?
Est-ce que je fais quelque chose de mal?
Quelqu'un peut-il expliquer ce résultat?
EDIT Pour le commentaire que CET n'est pas Europe / Berlin.
Je sélectionne simplement les valeurs de pg_timezone_names.
select * from pg_timezone_names where abbrev ='CEST';
name | abbrev | utc_offset | is_dst
------+--------+------------+--------
et
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
.....
Pendant l'hiver Europe / Berlin est +01. En été, il fait +02.
EDIT2
En 2012-10-28, le fuseau horaire est passé de l'heure d'été à l'heure d'hiver à 2h00.
Ces deux records ont la même valeur en Europe / Berlin:
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
Cela suggère que si j'utilise l'une des abréviations (CET ou CEST) pour la plage de données volumineuses (heure d'été et heure d'hiver), le résultat sera incorrect pour certains enregistrements. Ce sera bien si j'utilise «Europe / Berlin».
J'ai changé l'heure système en '2012-01-17' et pg_timezone_names a également changé.
select * from pg_timezone_names where name ='Europe/Berlin';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CEST | 02:00:00 | t
CET
n'est pas le cas Europe/Berlin
- du moins pas pendant l'heure d'été.
2012-10-28 01:30:00
c'est CEST, pas CET.