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

jOOQ Zeitstempel wird mit lokalem Zeitzonen-Offset gespeichert

Leider sprechen einige Dinge gegen Sie:

  1. Der PostgreSQL-JDBC-Treiber stellt die Zeitzone auf Ihre JVM-Zeitzone in der Postgres-Sitzung ein. Auch wenn Ihr Datenbankserver in UTC läuft, wird ein TIMESTAMP-Feld mit der Zeitzone Ihrer JVM eingefügt. Wenn Sie Daten einfügen oder abfragen, verwendet der Datenbankserver immer die JVM-Zeitzone.
  2. Sie verwenden TIMESTAMP statt TIMESTAMPTZ. Die Beschreibung dieser Typen spiegelt nicht ihre tatsächliche Verwendung wider. TIMESTAMPTZ bedeutet eigentlich zeitzonenunabhängig. Unabhängig davon, welchen Wert Sie eingeben, wird er mithilfe der Sitzungszeitzone an UTC angepasst.

Wenn Sie zwei verschiedene JVMs haben – eine mit der Zeit von Los Angeles und die andere mit der Zeit von New York – wird aufgrund dieser beiden Probleme jedes Mal, wenn Sie einen TIMESTAMP mit einer JVM schreiben, eine andere „UTC-Zeit“ in der anderen JVM verwendet. TIMESTAMP nimmt den angepassten Wert und verwendet ihn einfach wie angegeben. Wenn Sie Ihre TIMESTAMP-Spalten in TIMESTAMPTZ ändern, ist die gleiche Zeit in beiden JVMs immer die gleiche UTC-Zeit.

Wenn Sie sich die ConnectionFactoryImpl#openConnectionImp des Postgres-JDBC-Treibers ansehen, können Sie sehen, wo sie die Zeitzone Ihrer lokalen JVM als Zeitzone für die Sitzungszone des Datenbankservers festlegt.

Der einzige vernünftige Weg, damit umzugehen, besteht darin, immer nur TIMESTAMPTZ anstelle von TIMESTAMP zu verwenden. Hier sind einige weitere Informationen dazu:

PostgreSQL/JDBC und TIMESTAMP vs. TIMESTAMPTZ

http://justatheory.com/computers/databases/postgresql/use-timestamptz .html