Ich habe eine Spalte des TIMESTAMP WITHOUT TIME ZONE
Typs und möchte diese Standardeinstellung auf die aktuelle Zeit in UTC setzen. Das Abrufen der aktuellen Uhrzeit in UTC ist einfach:
postgres=# select now() at time zone 'utc';
timezone
----------------------------
2013-05-17 12:52:51.337466
(1 row)
Wie wird der aktuelle Zeitstempel für eine Spalte verwendet:
postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
ts
----------------------------
2013-05-17 14:54:33.072725
(1 row)
Aber das nutzt die Ortszeit. Der Versuch, dies auf UTC zu erzwingen, führt zu einem Syntaxfehler:
postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR: syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...
postgresql
timezone
timestamp
Wichert Akkerman
quelle
quelle
ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;
schlägt fehl mit :ERROR: column "UTC" does not exist
. Stellen Sie sicher, dass'utc'
alles in Kleinbuchstaben geschrieben ist.'utc'
Zeichenfolge muss auch in einfachen Anführungszeichen und nicht in doppelten Anführungszeichen stehen.Noch eine andere Lösung:
quelle
Wickeln Sie es in eine Funktion:
quelle
Wie wäre es mit
Wenn Ihr anderer Zeitstempel keine Zeitzone hat, ergibt diese Besetzung den passenden Typ "Zeitstempel ohne Zeitzone" für die aktuelle Zeit.
Ich würde gerne lesen, was andere über diese Option denken. Ich vertraue immer noch nicht auf mein Verständnis dieses "mit / ohne" Zeitzonenmaterials.
EDIT: Michael Ekokas Kommentar hier hinzufügen, weil er einen wichtigen Punkt verdeutlicht:
quelle
Dies sind 2 äquivalente Lösungen:
(im folgenden Code, sollten Sie ersetzen
'UTC'
für Zone undnow()
für Zeitstempel )timestamp AT TIME ZONE zone
- SQL-Standard-konformtimezone(zone, timestamp)
- wohl besser lesbarErläuterung:
'UTC'
) oder als Intervall (z. B.INTERVAL '-08:00'
) angegeben werden. Hier finden Sie eine Liste aller verfügbaren Zeitzonennow()
Gibt einen Wert vom Typ Zeitstempel (genau das, was wir benötigen) mit der angehängten Standardzeitzone Ihrer Datenbank zurück (z2018-11-11T12:07:22.3+05:00
. B. ).timezone('UTC', now())
wandelt unsere aktuelle Zeit (vom Typ Zeitstempel mit Zeitzone ) in das zeitzonenlose Äquivalent in umUTC
.ZB
SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'
wird wiederkommen2020-03-16T20:00:00Z
.Docs: Zeitzone ()
quelle
at timezone 'utc'
und das hat mit meinem PostgreSQL-Setup nicht funktioniert. Mit Großbuchstaben gelöst ProblemFunktion existiert bereits: Zeitzone ('UTC' :: text, now ())
quelle