Ich beantwortete diese Stapelüberlauf- Frage und fand ein merkwürdiges Ergebnis:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
und nächste Abfrage
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
Ich benutze PostgreSQL 9.1.2 und Ubuntu 12.04.
Habe gerade überprüft, dass am 8.2.11 das selbe Ergebnis vorliegt.
Laut Dokumentation ist es egal, ob ich Namen oder Abkürzungen benutze.
Ist das ein Bug?
Mache ich etwas falsch?
Kann jemand dieses Ergebnis erklären?
EDIT Für den Hinweis, dass CET nicht Europa / Berlin ist.
Ich wähle nur Werte aus pg_timezone_names aus.
select * from pg_timezone_names where abbrev ='CEST';
name | abbrev | utc_offset | is_dst
------+--------+------------+--------
und
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
.....
Im Winter ist Europa / Berlin +01. Im Sommer ist es +02.
EDIT2
In 2012-10-28 Zeitzone hat Wechsel von Sommerzeit auf Winterzeit um 2:00.
Diese beiden Datensätze haben in Europa / Berlin den gleichen Wert:
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
Dies deutet darauf hin, dass, wenn ich eine der Abkürzungen (MEZ oder MESZ) für den Big-Data-Bereich (Sommerzeit und Winterzeit) verwende, das Ergebnis für einige Datensätze falsch ist. Wird gut, wenn ich 'Europa / Berlin' benutze.
Ich habe die Systemzeit auf '2012-01-17' geändert und pg_timezone_names hat sich ebenfalls geändert.
select * from pg_timezone_names where name ='Europe/Berlin';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CEST | 02:00:00 | t
CET
ist nicht Europe/Berlin
- zumindest nicht während DST Zeiten.
2012-10-28 01:30:00
MESZ, nicht MEZ ist.