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

8

Es scheint (und vielleicht irre ich mich), wenn Sie die Zeitzone, in der etwas mit JDBC und Postgres passiert ist, erhalten wollen, müssen Sie die Zeitzone getrennt vom Zeitstempel speichern.

Das wäre, würde ich meinem ORM / JDBC / JPA lieber ein Java Calendar (oder Joda DataTime ) geben mit der Zeitzone America/New_York an ein Postgres timestampz Feld. UND ich würde beim Abruf erwarten, unabhängig von der Server-Zeitzone (oder Standard auf UTC), um mir eine Calendar mit Zeitzone America/New_York zurückzugeben. Aber nur auf die meisten JDBC-Code (und Dinge, die davon abhängen, die nicht passieren).

Ist das korrekt?

Das scheint lächerlich, dass ich die tz in einem anderen Feld speichern müsste, wenn Postgres es unterstützt.

Es scheint also, als wären die einzigen zwei Optionen:

  1. Wählen Sie die Spalte timestampz Postgres als java.util.String aus und parsen Sie sie.
  2. Speichern Sie die Zeitzone als separates Feld.

Option eins und zwei würde eine Art von Umwandlungs-Interzeptoren für meine SQL-Mapping / ORM-Bibliotheken erfordern.

  • Was ist die beste Lösung für JDBC?
  • Was ist die beste Lösung für JPA (wenn anders als JDBC)?
Adam Gent 08.09.2012, 15:16
quelle

2 Antworten

9

Wenn Sie ein timestamp with time zone ( timestamptz ) speichern, wird es für die Speicherung in der DB in UTC konvertiert. Wenn es abgerufen wird, 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, aber nicht enthält einen Zeitstempel. Wenn Sie eine timestamp mit Ihrer Client-Zeitzone auf UTC speichern und diese dann abrufen, wenn die Client-Zeitzone "+08: 00" lautet, erhalten Sie den gleichen Wert. Das ist die Hälfte, die Sie wollen, indem es den Wert der Rohzeit beibehält.

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

Sie müssen die Zeitzone separat speichern, wenn Sie einen Zeitpunkt in einer bestimmten Zeitzone erfassen möchten. Ich würde empfehlen, es als INTERVAL mit einer CHECK Einschränkung zu speichern, die es auf colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR beschränkt. Diese Definition weist -12: 00 zurück und akzeptiert +12: 00; Ich bin mir nicht ganz sicher, ob das stimmt, also schau nach.

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

Bei JDBC funktioniert beides. Für JPA hängt es davon ab, wie gut Ihr Anbieter Intervalltypen versteht und abbildet. Im Idealfall möchten Sie ein transient erzeugtes Feld in Ihrer Entität, das die gewünschte Kalenderinstanz mit den in der Datenbank gespeicherten timestamp und interval rekonstruiert.

    
Craig Ringer 09.09.2012, 11:40
quelle
0

EclipseLink unterstützt das Speichern der Zeitzone in Oracle, ich denke, Sie könnten es auch in Postgres speichern, wenn Sie Ihre PostgreSQL-Plattform anpassen.

    
James 10.09.2012 17:42
quelle

Tags und Links