Warum / wie hat sich das Verhalten des Extrahierens (Epoche…) aus den Feldern „Zeitstempel ohne Zeitzone“ zwischen PostgreSQL 8.4 und 9.2 geändert?

7

Kontext:

Wir führen derzeit PostgreSQL 8.4 in der Produktion aus und testen 9.2 intern für ein zukünftiges Upgrade. In Bezug auf Daten sind einige Probleme aufgetreten. Die Server, auf denen 8.4 und 9.2 ausgeführt werden, sind in jeder Hinsicht identisch mit den PostgreSQL-Versionen und -Konfigurationen. Auf beiden Serversätzen werden dieselben genauen Daten gespeichert. es wird mit pg_dumpund übertragen pg_restore.

In einem Teil unserer Datenbank speichern wir Daten in einem Feld vom Typ timestamp without time zone.

Problem:

Beim Zugriff auf Daten aus diesem Feld gibt eine extract(epoch..)Anfrage je nach Postgres-Version sehr unterschiedliche Ergebnisse zurück, z. B.:

#On Postgres 8.4. entered_timestamp is a "timestamp without time zone" type column:
SELECT entered_timestamp, extract(epoch from entered_timestamp) AS entered_timestamp from <table row>

 entered_timestamp      | entered_timestamp
 ----------------------------+-------------------
 2012-11-01 06:01:39.699612 |  1351774899.69961

Aber...

#On Postgres 9.2. All tables, schema, and data are identical, the SELECT statement is identical to the previous one:
SELECT entered_timestamp, extract(epoch from entered_timestamp) AS entered_timestamp from <table row>

 entered_timestamp      | entered_timestamp
 ----------------------------+-------------------
 2012-11-01 06:01:39.699612 |  1351749699.69961

Wie Sie sehen können, sind die zurückgegebenen Zeitstempel identisch, die zurückgegebenen Epochennummern jedoch nicht. Tatsächlich sind sie mehrere Stunden entfernt. Die Serverdaten und Linux-Zeitzonen auf beiden Servern sind identisch (innerhalb einer Sekunde voneinander). Die Postgres-Zeitzonen sind ebenfalls identisch: Wenn SELECT current_setting('timezone')auf beiden Servern ausgeführt wird, werden auch dieselben Daten zurückgegeben. Wenn Sie SELECT now()auf beiden Servern ausgeführt werden, werden nahezu identische Werte zurückgegeben.

Frage:

  1. Wie hat sich das Verhalten von extract(epoch...)Feldern vom Typ timestamp without time zonezwischen PostgreSQL 8.4 und PostgreSQL 9.2 geändert?

  2. Warum ist diese Änderung eingetreten?

  3. Gibt es eine Möglichkeit, diese Änderung zu verhindern, ohne mein Schema oder frühere Daten zu ändern (dh einen konfigurationsbasierten Fix)?

Zac B.
quelle
PostgreSQL 9.1: 1351746099.69961 MySQL (!!) 5.0: 1351746099 Sieht so aus, als hätten Sie ein Problem mit Version 8.4, nicht 9.2
Frank Heikens

Antworten:

8

Wenn ich dies auf meinem eigenen Computer teste, erhalte ich 1351749699.69961 als Ergebnis sowohl für PostgreSQL 8.4.10 als auch für 9.2.1.

Mit PostgreSQL 8.4.10 ändert sich das Ergebnis entsprechend der Sitzungszeitzone. Mit 9.2 ist dies nicht der Fall.

Dies ist wahrscheinlich der Effekt dieser Änderung: Messen Sie die Epoche der Zeitstempel-ohne-Zeit-Zone von der lokalen nicht UTC-Mitternacht. Dies wird als Änderung der 9.2-Kompatibilität vermerkt.

Die vorgeschlagene Problemumgehung in den Änderungsnotizen besteht darin, den Zeitstempel zuerst in einen Zeitstempel umzuwandeln: nicht nur eine Konfigurationsänderung.

Persönlich finde ich das 9.2-Verhalten angenehmer. Die Unix-Epoche ist als UTC definiert, was effektiv bedeutet, dass einfache Zeitstempelwerte als UTC interpretiert werden. So verwende ich sie sowieso.

araqnid
quelle