Ich habe eine Spalte added_at
des Typs timestamp without time zone
. Ich möchte, dass der Standardwert das aktuelle Datum und die aktuelle Uhrzeit ist, jedoch ohne Zeitzone. Die Funktionnow()
gibt auch eine Zeitzone zurück.
Wie löse ich dieses Problem?
postgresql
timestamp
postgresql-9.2
ア レ ッ ク ス
quelle
quelle
with timestamp
, insbesondere wenn Ihr Code überall dort ausgeführt wird, wo Sommerzeit verwendet wird. Oder sparen Sie die Zeit in UTC, nicht in einer lokalen Zeitzone. Sie können jederzeit wählen , welche Zeitzone Sie wollen in die Daten anzuzeigen.with timezone
?timestamp with time zone
. Es hat überhaupt keine Zeitzone. Es ist nur in absoluter UTC-Zeit, mit Konvertierung in / von der Ortszeit in derTimeZone
Sitzungsvariablen. Verwenden Sie einfachtimestamp with time zone
; Es ist fast immer die richtige Wahl.Antworten:
SELECT now()::timestamp;
Die Besetzung konvertiert die
timestamptz
zurückgegebenennow()
in die entsprechendentimestamp
in Ihrer Zeitzone - definiert durch dietimezone
Einstellung der Sitzung. So wird auch die Standard-SQL-FunktionLOCALTIMESTAMP
in Postgres implementiert.Wenn Sie nicht in mehreren Zeitzonen arbeiten, funktioniert das einwandfrei. Andernfalls wechseln Sie zu
timestamptz
füradded_at
. Der Unterschied?Übrigens macht das genau das Gleiche, nur lauter und teurer:
SELECT now() AT TIME ZONE current_setting('timezone');
quelle
select now()::timestamptz;
ist ein besseres Spielnow()
kehrt bereits zurücktimestamptz
,now()::timestamptz
macht also nichts Nützliches.localtimestamp
?now()::timestamp
Möglicherweise wird ein Casting durchgeführt, aber es wird für mich nicht von der lokalen Zeitzone in UTC konvertiert. Abernow() AT TIME ZONE 'UTC';
macht das Richtige.now() AT TIME ZONE 'UTC'
die Ortszeit für die Zeitzone UTC zurück.LOCALTIMESTAMP
odernow()::timestamp
geben Sie die Ortszeit für die aktuelletimezone
Einstellung der Sitzung zurück. Zwei verschiedene Dinge! Gibt nur dasselbe zurück, während Ihre aktuelle Sitzung mit ausgeführt wirdtimezone = 'UTC'
.Nun, Sie können so etwas tun wie:
SELECT now() AT TIME ZONE current_setting('TimeZone'); SELECT now() AT TIME ZONE 'Europe/Paris'; SELECT now() AT TIME ZONE 'UTC';
Ich bin mir nicht sicher, wie das für eine Spalte "added_at" Sinn macht. Sie möchten fast immer einen absoluten Zeitstempel (Zeitstempel mit Zeitzone), keinen schwebenden.
Bearbeiten Sie die Antwort auf die folgenden Punkte:
Ja, sollte einen Zeitstempel mit Zeitzone (absolute Zeit) verwenden, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.
Die Client-Zeitzone wird von
SHOW TimeZone
odercurrent_setting(...)
wie oben gezeigt angegeben.Nehmen Sie sich etwas Zeit, um die Handbücher zu überfliegen - sie decken das alles recht gut ab.
quelle
timestamp with time zone
? 2) Woher weiß ich, wie aktuell die Zeitzone eines Computers ist, auf dem postgresql ausgeführt wird?"Aktuelles Datum / Uhrzeit" :
quelle
Neue und native Antwort im Jahr 2020
Wenn Sie in PostgreSQL nur die aktuelle Datums- und Uhrzeitangabe durch Aufrufen
CURRENT_TIMESTAMP()
ohne Zeitzone und gebrochene Ziffern im Sekundenfeld, die nach dem Dezimalpunkt des Sekundenfelds stehen , anzeigen möchten ?(Getestet mit PostgreSQL v12.4)
Dann benutze dies:
SELECT CURRENT_TIMESTAMP(0)::TIMESTAMP WITHOUT TIME ZONE;
Wenn Sie den Datentyp Ihrer Spalte als
timestamp
(nicht alstimestamptz
) definieren, können Sie den Zeitstempel ohne Zeitzone speichern. In diesem Fall müssen Sie ihn nicht hinzufügenTIMESTAMP WITHOUT TIME ZONE
So was:
CREATE TABLE foo (created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP(0))
In der obigen Funktion wird 0 übergeben, um die gebrochenen Ziffern im Sekundenfeld zu entfernen.
quelle