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_dump
und ü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:
Wie hat sich das Verhalten von
extract(epoch...)
Feldern vom Typtimestamp without time zone
zwischen PostgreSQL 8.4 und PostgreSQL 9.2 geändert?Warum ist diese Änderung eingetreten?
Gibt es eine Möglichkeit, diese Änderung zu verhindern, ohne mein Schema oder frühere Daten zu ändern (dh einen konfigurationsbasierten Fix)?
quelle
Antworten:
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.
quelle