PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

jOOQ Timestamp memorizzato con offset del fuso orario locale

Sfortunatamente hai alcune cose che funzionano contro di te:

  1. Il driver PostgreSQL JDBC imposta il fuso orario sul fuso orario della JVM nella sessione di Postgres. Quindi, anche se il tuo server database è in esecuzione in UTC, verrà inserito un campo TIMESTAMP utilizzando il fuso orario della tua JVM. Quando si inseriscono o si interrogano i dati, il server del database utilizzerà sempre il fuso orario della JVM.
  2. Stai usando TIMESTAMP invece di TIMESTAMPTZ. La descrizione di questi tipi non riflette il loro effettivo utilizzo. TIMESTAMPTZ in realtà significa indipendente dal fuso orario. Qualunque sia il valore inserito, verrà adattato all'ora UTC utilizzando il fuso orario della sessione.

A causa di questi due problemi, se disponi di due JVM diverse, una che utilizza l'ora di Los Angeles e l'altra che utilizza l'ora di New York, ogni volta che scrivi un TIMESTAMP con una JVM, sarà un "ora UTC" diverso nell'altra JVM. TIMESTAMP prende il valore regolato e lo usa semplicemente come dato. Se modifichi le colonne TIMESTAMP in TIMESTAMPTZ, la stessa ora in entrambe le JVM sarà sempre la stessa ora UTC.

Se guardi ConnectionFactoryImpl#openConnectionImp del driver JDBC Postgres puoi vedere dove imposta il fuso orario della tua JVM locale come fuso orario per la zona di sessione del server di database.

Quindi l'unico modo sano di affrontare questo è usare sempre e solo TIMESTAMPTZ invece di TIMESTAMP. Ecco qualche informazione in più su questo:

PostgreSQL/JDBC e TIMESTAMP rispetto a TIMESTAMPTZ

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