Ich arbeite an einem PostgreSQL-DB-Design und frage mich, wie ich Zeitstempel am besten speichern kann.
Annahmen
Benutzer in verschiedenen Zeitzonen verwenden die Datenbank für alle CRUD-Funktionen.
Ich habe mir 2 Möglichkeiten angesehen:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
Für timestamp
würde ich eine Zeichenfolge senden, die den genauen (UTC) Zeitstempel für den INSERT Moment darstellen würden.
Denn bigint
ich würde genau das Gleiche speichern, aber in einem Zahlenformat. (Zeitzonenprobleme werden behandelt, bevor Millis an den Server übergeben wird, also immer Millis in UTC.)
Ein Hauptvorteil beim Speichern von a bigint
könnte sein, dass es einfacher zu speichern und abzurufen ist, da die Übergabe eines korrekt formatierten Zeitstempels komplexer ist als eine einfache Zahl (Millis seit Unix Epoc).
Meine Frage ist, welches das flexibelste Design zulässt und was die Fallstricke jedes Ansatzes sein könnten.
Antworten:
Speichern Sie Zeitstempel als
timestamp
oder besser alstimestamptz
(timestamp with time zone
), da Sie mit mehreren Zeitzonen arbeiten . Das erzwingt gültige Daten und ist in der Regel am effizientesten. Vergewissern Sie sich, dass Sie den Datentyp verstanden haben. Es gibt einige Missverständnisse:Um Ihr Anliegen anzusprechen:
Sie können eine UNIX-Epoche auf beide Arten übergeben und abrufen, wenn Sie dies vorziehen:
Verbunden:
Wenn Sie den aktuellen Zeitstempel mit Schreibvorgängen in die Datenbank speichern möchten , verwenden Sie eine
timestamptz
Spalte mit Standardwertnow()
. Die Systemzeit auf dem DB-Server ist in der Regel viel zuverlässiger und konsistenter als mehrere Clients, die ihre jeweilige Uhrzeit angeben.Denn
INSERT
es kann so einfach sein wie:Und schreibe einfach nicht in diese Spalte. Es wird automatisch ausgefüllt.
quelle
Sie sollten Daten immer in ihrem nativen Datentyp speichern, damit Sie die integrierten Funktionen verwenden können. Und der Datentyp eines Zeitstempels ist offensichtlich a
timestamp
.Btw, eine
timestamp
wird nicht als String gespeichert ist , ist es als eine 8-Byte - Ganzzahl gespeichert, genau das gleiche wiebigint
: PostgreSQL - Dokumentation .quelle