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

Geben Sie eine Zeitzone an, die als Referenzzeitzone verwendet werden soll

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.