Stavo rispondendo a questa domanda di StackOverflow e ho trovato strani risultati:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
e la prossima query
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
Sto usando PostgreSQL 9.1.2 e Ubuntu 12.04.
Ho appena verificato che il risultato 8.2.11 è lo stesso.
Secondo la documentazione non importa se uso il nome o l'abbreviazione.
è un insetto?
Sto facendo qualcosa di sbagliato?
Qualcuno può spiegare questo risultato?
MODIFICA Per il commento che CET non è Europa / Berlino.
Sto solo selezionando i valori da 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 l'inverno l'Europa / Berlino è +01. Durante l'estate è +02.
EDIT2
Nel 28-10-2012 il fuso orario è cambiato dall'ora legale all'orario invernale alle 2:00.
Questi due record hanno lo stesso valore in Europa / Berlino:
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
Questo suggerisce che se uso una delle abbreviazioni (CET o CEST) per l'intervallo di big data (ora legale e orario invernale) il risultato sarà errato per alcuni dei record. Andrà bene se uso "Europa / Berlino".
Ho cambiato l'ora di sistema in "2012-01-17" e anche pg_timezone_names è cambiato.
select * from pg_timezone_names where name ='Europe/Berlin';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CEST | 02:00:00 | t
CET
è - almeno non durante i periodi di ora legale. Europe/Berlin
2012-10-28 01:30:00
sia CEST, non CET.