PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

jOOQ Timestamp étant stocké avec décalage de fuseau horaire local

Malheureusement, vous avez quelques éléments qui jouent contre vous :

  1. Le pilote PostgreSQL JDBC définit le fuseau horaire sur votre fuseau horaire JVM dans la session Postgres. Ainsi, même si votre serveur de base de données fonctionne en UTC, un champ TIMESTAMP sera inséré en utilisant le fuseau horaire de votre JVM. Lorsque vous insérez ou interrogez des données, le serveur de base de données utilise toujours le fuseau horaire JVM.
  2. Vous utilisez TIMESTAMP au lieu de TIMESTAMPTZ. La description de ces types ne reflète pas leur utilisation réelle. TIMESTAMPTZ signifie en fait indépendant du fuseau horaire. Quelle que soit la valeur que vous insérez, elle sera ajustée sur UTC en utilisant le fuseau horaire de la session.

En raison de ces deux problèmes, si vous avez deux JVM différentes - l'une utilisant l'heure de Los Angeles et l'autre utilisant l'heure de New York - chaque fois que vous écrivez un TIMESTAMP avec une JVM, ce sera une "heure UTC" différente dans l'autre JVM. TIMESTAMP prend la valeur ajustée et l'utilise simplement comme indiqué. Si vous modifiez vos colonnes TIMESTAMP en TIMESTAMPTZ, la même heure dans les deux JVM sera toujours la même heure UTC.

Si vous regardez le ConnectionFactoryImpl#openConnectionImp du pilote Postgres JDBC, vous pouvez voir où il définit le fuseau horaire de votre JVM locale comme fuseau horaire pour la zone de session du serveur de base de données.

Donc, la seule façon sensée de gérer cela est de n'utiliser que TIMESTAMPTZ au lieu de TIMESTAMP. Voici quelques informations supplémentaires à ce sujet :

PostgreSQL/JDBC et TIMESTAMP contre TIMESTAMPTZ

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