PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Eigenartige Zeitzonenbehandlung in einer Postgres-Datenbank

Das Problem scheint nichts mit Amazon RDS zu tun zu haben:Es hat mit der von PostgreSQL verwendeten Konvention zu tun. In diesem Fall tun Sie es haben den Zeitzonennamen rückwärts. Sie meinen 'UTC-01' wo Sie 'UTC+01' schreiben .
Aus dem Handbuch :

Also Zeitzonenstring, der für SET TIME ZONE verwendet wird (und die Anzeige von SHOW timezone , entsprechend) oder AT TIME ZONE verwenden Sie das Gegenzeichen was in timestamp angezeigt wird (with time zone ) Literale! Das ist eine sehr unglückliche Meinungsverschiedenheit zwischen ISO und SQL-Standard einerseits und POSIX andererseits. (Ich denke, POSIX ist schuld.) Siehe:

Aber 'CET' oder 'UTC-01' sind beide immer noch potenziell falsch für Paris, weil sie keine Regeln für die Sommerzeit erlassen berücksichtigen.
(Die Sommerzeit ist eines der schwachsinnigsten Konzepte in der Geschichte der Menschheit.)

Paris (wie fast ganz Europa) verwendet im Winter MEZ und im Sommer MESZ. Ihre Tests mit 'CET' nur zufällig im November zu arbeiten. Wenn Sie dasselbe im Sommer versuchen, erhalten Sie ein falsches Ergebnis.

Verwenden Sie zur Sicherheit immer den Zeitzonennamen 'Europe/Paris' , das DST-Regeln berücksichtigt. Der Anruf ist teurer.

Die Funktion current_time berücksichtigt DST-Regeln, wenn Ihre Zeitzoneneinstellung dies vorsieht. Aber 'UTC-01' ist ein einfacher Zeitversatz. Ich verwende nie den Datentyp time with time zone oder current_time zunächst. Nochmal die Anleitung:

Bedenken Sie:

SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_winter
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST'   AS cest_summer
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_no_dst  -- CET wrong!
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer
     , '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter

Verwandte: