Sie müssen das Zeitzonen-Offset zusätzlich speichern zum timestamp
.
Wie @Milen bereits erklärt hat (und mit dem Handbuch
verlinkt ist). ):ein timestamp
speichert nur einen Zeitpunkt (als abstrakten Wert). Der Zeitzonenmodifikator ist not gespeichert, es dient nur zum Anpassen des timestamp
relativ zu UTC
.
Betrachten Sie die folgende Demo:
-- DROP TABLE tbl;
CREATE TEMP TABLE tbl (id int, myts timestamptz, mytz interval);
INSERT INTO tbl VALUES
(1, now() , EXTRACT (timezone from now()) * interval '1s')
,(2, '2012-01-01 00:00-05', interval '-5h')
,(3, '2012-01-01 00:00+04', interval '4h')
,(4, '2012-11-11 20:30+03', interval '3h');
SELECT *
,(myts AT TIME ZONE mytz)::text
|| CASE WHEN mytz > '0:0' THEN '+' ELSE '' END
|| to_char(mytz, 'FMHH24:mi') AS timestamp_at_origin
FROM tbl;
Führen Sie es lokal aus, um es anzuzeigen. Achten Sie besonders auf die Details von IN DER ZEITZONE
konstruieren, und wie ich die Zeitzone aus dem (lokalen!) timestamp with time zone
extrahiere .now()
gibt timestamp with time zone
zurück oder timestamptz
kurz.
EXTRACT (timezone from now()) * interval '1s'
timestamp_at_origin
zeigt den Zeitstempel mit der Zeitzone an seinem Ursprung an. Wenn ich Ihre Frage verstanden habe, suchen Sie danach.
Sie könnten die Formatierung weiter verbessern.
Diese verwandte Frage könnte Sie interessieren die etwas Licht auf die Mehrdeutigkeiten und Fallstricke von Zeitzonen wirft.