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)?