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

Postgres-Zeitstempel

Hier gibt es keine kugelsicheren Lösungen.

Mein erster Ratschlag:Verlassen Sie sich niemals auf die Standardzeitzone des Servers.

Mein zweiter Rat:Wählen Sie zwischen timestamp -timestamptz nach der (vorherrschenden) Semantik der Daten.

Genauer gesagt:PostgresSQL hat zwei Zeitstempelvarianten mit dem verwirrenden Namen TIMESTAMP WITHOUT TIMEZONE (timestamp) und TIMESTAMP WITH TIMEZONE (timestamptz) . Eigentlich weder noch speichert eine Zeitzone, noch nicht einmal einen Offset. Beide Datentypen belegen die gleiche Breite (4 Byte), und ihr Unterschied ist subtil - und schlimmer noch, kann Sie beißen, wenn Sie sie nicht vollständig verstehen und Ihr Server die Zeitzone ändert. Mein Vernunftregelsatz ist:

  • Verwenden Sie TIMESTAMP WITH TIMEZONE (timestamptz) zur Speicherung von Ereignissen, die überwiegend auf die "physikalische" Zeit bezogen sind , für die Sie hauptsächlich daran interessiert sind abzufragen, ob event 1 war vor event 2 (unabhängig von Zeitzonen) oder die Berechnung von Zeitintervallen (in "physischen Einheiten", zB Sekunden; nicht in "zivilen" Einheiten wie Tage-Monate usw.). Das typische Beispiel sind die Erstellungs-/Änderungszeiten von Aufzeichnungen - was man normalerweise mit dem Wort "Zeitstempel" meint ".

  • Verwenden Sie TIMESTAMP WITHOUT TIMEZONE (timestamp) zum Speichern von Ereignissen, für die die relevante Information die "zivile Zeit" ist (d. h. die Felder {year-month-day hour-min-sec} als Ganzes), und die Abfragen beinhalten Kalenderberechnungen. In diesem Fall würden Sie hier nur die "lokale Zeit" speichern, d. h. die Datums-Zeit relativ zu einer nicht spezifizierten (irrelevanten oder impliziten oder woanders gespeicherten) Zeitzone.

Die zweite Option macht es Ihnen einfacher, beispielsweise nach "alle Ereignisse, die am Tag '2013-01-20' stattgefunden haben" (in jeder entsprechenden Region/Land/Zeitzone) abzufragen - macht es jedoch schwieriger, nach "allen Ereignissen, die (physisch) vor einem Referenzereignis aufgetreten sind" (es sei denn, wir wissen, dass sie sich in derselben Zeitzone befinden). Sie wählen.

Wenn Sie das Ganze benötigen, reicht beides nicht aus, Sie müssen entweder die Zeitzone oder den Offset in einem zusätzlichen Feld speichern. Eine andere Option, die einige Bytes verschwendet, aber für Abfragen effizienter sein kann, besteht darin, beide Felder zu speichern.

Siehe auch diese Antwort .