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

¿Debo almacenar la zona horaria por separado de la marca de tiempo para Postgres y JDBC?

Cuando almacena una timestamp with time zone (timestamptz ) se convierte a UTC para el almacenamiento en la base de datos. Cuando se recupera, se convierte a la zona horaria actual del cliente, no a la zona horaria en la que estaba originalmente. Básicamente, es un punto en el tiempo.

También hay timestamp without time zone (timestamp ). Esto no está sujeto a conversión, pero no llevar una marca de tiempo con él. Si almacena una timestamp con la zona horaria de su cliente configurada en UTC, luego recupérela cuando la zona horaria del cliente sea '+08:00', obtendrá el mismo valor. Eso es la mitad de lo que quieres, ya que conserva el valor de tiempo sin procesar.

Los nombres y comportamientos son terribles y confusos, pero están establecidos por el estándar SQL.

Debe almacenar la zona horaria por separado si desea registrar un punto en el tiempo en una zona horaria en particular. Recomiendo almacenarlo como un INTERVAL con un CHECK restricción que lo limita a ser colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR . Esa definición rechaza -12:00 y acepta +12:00; No estoy totalmente seguro de que sea correcto, así que compruébalo.

Puede almacenar la timestamp de la hora local en esa zona horaria (lo que probablemente haría), o almacenar el timestamptz de la hora UTC cuando ocurrió el evento más un desplazamiento que le permite convertirlo a la hora local.

Cualquiera funcionará bien para JDBC. Para JPA, dependerá de qué tan bien comprenda su proveedor y mapee los tipos de intervalo. Idealmente, desea un campo generado transitorio en su entidad que reconstruya la instancia de Calendario que desea utilizando la timestamp y interval almacenado en la base de datos.