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

PostgreSQL/JDBC und TIMESTAMP vs. TIMESTAMPTZ

Im Allgemeinen TIMESTAMPTZ verwenden

Hier ist ein Ratschlag von David E. Wheeler, einem Postgres-Experten, in einem Blogbeitrag, dessen Titel alles sagt:
Immer TIMESTAMP MIT ZEITZONE (TIMESTAMPTZ) verwenden

Wenn Sie tatsächliche Momente, bestimmte Punkte auf der Zeitachse verfolgen, verwenden Sie TIMESTAMP WITH TIME ZONE .

Eine Ausnahme:Partitionierung

Wheelers einzige Ausnahme ist die Partitionierung nach Zeitstempeln aufgrund technischer Einschränkungen. Eine seltene Ausnahme für die meisten von uns.

Informationen zur Partitionierung finden Sie unter doc und siehe Wiki .

Falsche Bezeichnung

Die Datentypen nennen timestamp with time zone und timestamp without time zone sind Fehlbezeichnungen. In beidem Fällen wird der Datum-Uhrzeit-Wert in UTC gespeichert (kein Zeitzonen-Offset). Lesen Sie den vorherigen Satz noch einmal. UTC, immer. Der Ausdruck „mit Zeitzone“ bedeutet „mit Beachtung der Zeitzone“, nicht „die Zeitzone neben diesem Wert speichern“. Der Unterschied zwischen den Typen besteht darin, ob eine beliebige Zeitzone entweder beim Speichern (INSERT oder UPDATE) oder beim Abrufen (SELECT-Abfrage) angewendet werden soll. (Dieses Verhalten wird für Postgres beschrieben – andere Datenbanken unterscheiden sich stark diesbezüglich.)

Genauer gesagt sollte man sagen, dass TIMESTAMP WITHOUT TIME ZONE Datum-Zeit-Werte ohne Zeitzone speichert. Aber ohne Zeitrahmenreferenz müsste jeder, der sich diese Daten ansieht, annehmen (hoffen, beten?), dass die Werte UTC sind. Aber noch einmal, strittig, da Sie diesen Typ fast nie verwenden sollten.

Lesen Sie das Dokument sorgfältig und experimentieren Sie ein wenig, um Ihr Verständnis zu verdeutlichen.

Unzoned

Wenn Sie anstelle eines bestimmten Moments die allgemeine Vorstellung einer möglichen Zeit speichern möchten, verwenden Sie den anderen Typ, TIMESTAMP WITHOUT TIME ZONE .

Zum Beispiel beginnt Weihnachten dieses Jahr am ersten Moment des 25. Dezember 2017. Das wäre 2017-12-25T 00:00:00 ohne Anzeige der Zeitzone oder Offset-von-UTC. Dieser Wert ist nur eine vage Vorstellung über mögliche Momente. Es hat keine Bedeutung, bis wir eine Zeitzone (oder einen Offset) anwenden. Also speichern wir dies mit TIMESTAMP WITHOUT TIME ZONE .

Die Elfen, die die Logistikabteilung für besondere Veranstaltungen des Weihnachtsmanns besetzen Wenden Sie die Zeitzonen als Teil ihres Planungsprozesses an. Die früheste Zeitzone ist derzeit Pacific/Kiribati , 14 Stunden vor UTC. Die Elfen planen die erste Ankunft des Weihnachtsmanns dort. Die Elfen legen einen Flugplan fest, der das Rentier in andere Zeitzonen bringt, in denen kurz nach Mitternacht Mitternacht ist, wie z. B. Pacific/Auckland . Sie gehen weiter nach Westen, wenn die Mitternacht jeder Zone eintrifft. Stunden später in Asia/Kolkata , noch später in Europe/Paris , noch mehr Stunden später in America/Montreal usw.

Jeder dieser spezifischen Liefermomente wurde von den Elfen mit WITH TIME ZONE aufgezeichnet , während diese allgemeine Vorstellung von Weihnachten als WITHOUT TIME ZONE gespeichert werden würde .

Eine weitere Verwendung in Business-Apps für WITHOUT TIME ZONE plant Termine weiter als mehrere Wochen im Voraus. Politiker auf der ganzen Welt haben eine unerklärliche Vorliebe dafür, mit der Uhr herumzuspielen und Zeitzonenregeln neu zu definieren. Sie treten der Sommerzeit (DST) bei, verlassen die Sommerzeit, beginnen die Sommerzeit an einem anderen Datum oder beenden die Sommerzeit an einem anderen Datum oder stellen ihre Uhren um 15 Minuten oder eine halbe Stunde um. All dies wurde in den letzten Jahren von der Türkei, den Vereinigten Staaten, Russland, Venezuela und anderen getan.

Die Politiker nehmen diese Änderungen oft ohne Vorwarnung vor. Wenn Sie also sechs Monate im Voraus einen Zahnarzttermin um 13:00 Uhr planen, sollte dieser wahrscheinlich als TIMESTAMP WITHOUT TIME ZONE gespeichert werden Andernfalls können die Politiker Ihren Termin effektiv auf Mittag oder 14 Uhr oder 13:30 Uhr verschieben.