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

Zeitzonennamen mit identischen Eigenschaften führen zu unterschiedlichen Ergebnissen, wenn sie auf den Zeitstempel angewendet werden

Unmittelbar nachdem ich dies gepostet hatte, führte ich eine weitere Abfrage durch, um einen Verdacht zu überprüfen:

SELECT * FROM pg_timezone_abbrevs
WHERE  abbrev IN ('CEST', 'CET');

 abbrev | utc_offset | is_dst
--------+------------+--------
 CEST   | 02:00:00   | t
 CET    | 01:00:00   | f

Wie sich herausstellt, gibt es auch eine Zeitzonen-Abkürzung mit dem Namen CET (was Sinn macht, da "CET" eine Abkürzung ist). Und es scheint, dass PostgreSQL die Abkürzung dem vollständigen Namen vorzieht. Also, obwohl ich CET gefunden habe in der Zeitzone Namen , wird der Ausdruck '2012-01-18 1:0 CET'::timestamptz gemäß den subtil unterschiedlichen Regeln für Zeitzonen-Abkürzungen interpretiert .

SELECT '2012-01-18 1:0 CEST'::timestamptz(0)
      ,'2012-01-18 1:0 CET'::timestamptz(0)
      ,'2012-01-18 1:0 Europe/Vienna'::timestamptz(0);

      timestamptz       |      timestamptz       |      timestamptz
------------------------+------------------------+------------------------
 2012-01-18 00:00:00+01 | 2012-01-18 01:00:00+01 | 2012-01-18 01:00:00+01


SELECT '2012-08-18 1:0 CEST'::timestamptz(0)
      ,'2012-08-18 1:0 CET'::timestamptz(0)
      ,'2012-08-18 1:0 Europe/Vienna'::timestamptz(0);

      timestamptz       |      timestamptz       |      timestamptz
------------------------+------------------------+------------------------
 2012-08-18 01:00:00+02 | 2012-08-18 02:00:00+02 | 2012-08-18 01:00:00+02

Ich finde 10 Fälle von Zeitzonen-Abkürzungen in der Zeitzone Namen und nicht verstehen, warum diese da sind. Was ist der Zweck?

Darunter der Zeitversatz (utc_offset ) stimmt in vier Fällen aufgrund der DST-Einstellung nicht:

SELECT n.*, a.*
FROM   pg_timezone_names n 
JOIN   pg_timezone_abbrevs a ON  a.abbrev = n.name
WHERE  n.utc_offset <> a.utc_offset;

 name | abbrev | utc_offset | is_dst | abbrev | utc_offset | is_dst
------+--------+------------+--------+--------+------------+--------
 CET  | CEST   | 02:00:00   | t      | CET    | 01:00:00   | f
 EET  | EEST   | 03:00:00   | t      | EET    | 02:00:00   | f
 MET  | MEST   | 02:00:00   | t      | MET    | 01:00:00   | f
 WET  | WEST   | 01:00:00   | t      | WET    | 00:00:00   | f

In diesen Fällen können sich Leute täuschen lassen (so wie ich es war), indem sie den Namen von tz nachschlagen und Finden eines Zeitversatzes, der tatsächlich nicht angewendet wird. Das ist ein unglückliches Design - wenn schon kein Fehler, dann zumindest ein Dokumentationsfehler .

Ich kann im Handbuch nichts darüber finden, wie Mehrdeutigkeiten zwischen Zeitzonen-Namen auftreten und Abkürzungen sind gelöst. Natürlich haben Abkürzungen Vorrang.

Anhang B.1. Date/Time Input Interpretation erwähnt die Suche nach Zeitzonenabkürzungen, aber es bleibt unklar wie Zeitzone Namen identifiziert werden und welcher von ihnen im Falle eines mehrdeutigen Tokens Vorrang hat.

Wenn das Token eine Textzeichenfolge ist, gleichen Sie es mit möglichen Zeichenfolgen ab:

Suchen Sie in einer binären Suchtabelle nach dem Token als Zeitzonenabkürzung.

Nun, in diesem Satz gibt es einen leichten Hinweis darauf, dass Abkürzungen zuerst kommen, aber nichts Definitives. Außerdem gibt es eine Spalte abbrev in beiden Tabellen pg_timezone_names und pg_timezone_abbrevs ...