sql >> Base de Datos >  >> RDS >> PostgreSQL

jOOQ La marca de tiempo se almacena con el desplazamiento de la zona horaria local

Desafortunadamente, tienes algunas cosas en tu contra:

  1. El controlador JDBC de PostgreSQL establece la zona horaria en su zona horaria JVM en la sesión de Postgres. Entonces, incluso si su servidor de base de datos se ejecuta en UTC, se insertará un campo TIMESTAMP utilizando la zona horaria de su JVM. Cuando inserta o consulta datos, el servidor de la base de datos siempre utilizará la zona horaria de JVM.
  2. Está utilizando TIMESTAMP en lugar de TIMESTAMPTZ. La descripción de estos tipos no refleja su uso real. TIMESTAMPTZ en realidad significa independiente de la zona horaria. Cualquiera que sea el valor que inserte, se ajustará a UTC utilizando la zona horaria de la sesión.

Debido a estos dos problemas, si tiene dos JVM diferentes, una que usa la hora de Los Ángeles y la otra que usa la hora de Nueva York, cada vez que escriba un TIMESTAMP con una JVM, será una "hora UTC" diferente en la otra JVM. TIMESTAMP toma el valor ajustado y simplemente lo usa como se indica. Si cambia sus columnas TIMESTAMP para que sean TIMESTAMPTZ, la misma hora en ambas JVM siempre será la misma hora UTC.

Si observa ConnectionFactoryImpl#openConnectionImp del controlador JDBC de Postgres, puede ver dónde establece la zona horaria de su JVM local como la zona horaria para la zona de sesión del servidor de la base de datos.

Entonces, la única forma sensata de lidiar con esto es usar solo TIMESTAMPTZ en lugar de TIMESTAMP. Aquí hay más información sobre esto:

PostgreSQL/JDBC y TIMESTAMP frente a TIMESTAMPTZ

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