PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Soll ich die Zeitzone getrennt vom Zeitstempel für Postgres und JDBC speichern?

Wenn Sie einen timestamp with time zone speichern (timestamptz ) wird es zur Speicherung in der DB in UTC konvertiert. Beim Abrufen wird es in die aktuelle Zeitzone des Clients konvertiert, nicht in die Zeitzone, in der es ursprünglich war. Es ist im Grunde ein Zeitpunkt.

Es gibt auch timestamp without time zone (timestamp ). Dies unterliegt keiner Konvertierung, tut es aber nicht einen Zeitstempel mit sich führen. Wenn Sie einen timestamp hinterlegen Wenn Ihre Client-Zeitzone auf UTC eingestellt ist und Sie sie dann abrufen, wenn die Client-Zeitzone '+08:00' ist, erhalten Sie denselben Wert. Das ist die Hälfte dessen, was Sie wollen, da der Rohzeitwert erhalten bleibt.

Die Namen und Verhaltensweisen sind schrecklich und verwirrend, aber vom SQL-Standard festgelegt.

Wenn Sie einen Zeitpunkt in einer bestimmten Zeitzone erfassen möchten, müssen Sie die Zeitzone separat hinterlegen. Ich würde empfehlen, es als INTERVAL zu speichern mit einem CHECK Beschränkung auf colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR . Diese Definition lehnt -12:00 ab und akzeptiert +12:00; Ich bin mir nicht ganz sicher, ob das richtig ist, also überprüfe es.

Sie könnten entweder den timestamp speichern der Ortszeit in dieser Zeitzone (was ich wahrscheinlich tun würde) oder den timestamptz speichern der UTC-Zeit, als das Ereignis aufgetreten ist, plus einem Offset, mit dem Sie es in die Ortszeit umrechnen können.

Beides funktioniert gut für JDBC. Bei JPA hängt dies davon ab, wie gut Ihr Anbieter Intervalltypen versteht und abbildet. Idealerweise möchten Sie ein transient generiertes Feld in Ihrer Entität, das die gewünschte Kalenderinstanz mithilfe des timestamp rekonstruiert und interval in der Datenbank gespeichert.