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

Dois-je stocker le fuseau horaire séparément de l'horodatage pour Postgres et JDBC ?

Lorsque vous stockez un timestamp with time zone (timestamptz ) il est converti en UTC pour le stockage dans la base de données. Une fois récupéré, il est converti dans le fuseau horaire actuel du client, et non dans le fuseau horaire dans lequel il se trouvait à l'origine. Il s'agit essentiellement d'un point dans le temps.

Il y a aussi timestamp without time zone (timestamp ). Ceci n'est pas sujet à conversion, mais pas porter un horodatage avec elle. Si vous stockez un timestamp avec le fuseau horaire de votre client défini sur UTC, puis récupérez-le lorsque le fuseau horaire du client est '+08:00', vous obtenez la même valeur. C'est la moitié de ce que vous voulez, dans la mesure où cela préserve la valeur de temps brute.

Les noms et les comportements sont horribles et déroutants, mais définis par la norme SQL.

Vous devez enregistrer le fuseau horaire séparément si vous souhaitez enregistrer un point dans le temps dans un fuseau horaire particulier. Je vous recommande de le stocker en tant que INTERVAL avec un CHECK contrainte le limitant à colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR . Cette définition rejette -12:00 et accepte +12:00 ; Je ne suis pas tout à fait sûr que ce soit exact, alors vérifiez.

Vous pouvez soit stocker le timestamp de l'heure locale à ce fuseau horaire (ce que je ferais probablement), ou stocker le timestamptz de l'heure UTC lorsque l'événement s'est produit plus un décalage qui vous permet de le convertir en heure locale.

L'un ou l'autre fonctionnera bien pour JDBC. Pour JPA, cela dépendra de la façon dont votre fournisseur comprend et mappe les types d'intervalles. Idéalement, vous voulez un champ généré transitoire dans votre entité qui reconstruit l'instance Calendar que vous voulez en utilisant le timestamp et interval stockées dans la base de données.