Die Unterschiede werden in der PostgreSQL-Dokumentation für Datums-/Uhrzeittypen behandelt. Ja, die Behandlung von TIME
oder TIMESTAMP
unterscheidet sich zwischen einem WITH TIME ZONE
oder WITHOUT TIME ZONE
. Es wirkt sich nicht darauf aus, wie die Werte gespeichert werden; es wirkt sich darauf aus, wie sie interpretiert werden.
Die Auswirkungen von Zeitzonen auf diese Datentypen werden speziell in der Dokumentation behandelt. Der Unterschied ergibt sich aus dem, was das System vernünftigerweise über den Wert wissen kann:
-
Mit einer Zeitzone als Teil des Werts kann der Wert als Ortszeit im Client gerendert werden.
-
Ohne eine Zeitzone als Teil des Werts ist die offensichtliche Standardzeitzone UTC, also wird sie für diese Zeitzone gerendert.
Das Verhalten unterscheidet sich in Abhängigkeit von mindestens drei Faktoren:
- Die Zeitzoneneinstellung im Client.
- Der Datentyp (z. B.
WITH TIME ZONE
oderWITHOUT TIME ZONE
) des Wertes. - Ob der Wert mit einer bestimmten Zeitzone angegeben wird.
Hier sind Beispiele für die Kombinationen dieser Faktoren:
foo=> SET TIMEZONE TO 'Japan';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 00:00:00+09
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 06:00:00+09
(1 row)
foo=> SET TIMEZONE TO 'Australia/Melbourne';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 00:00:00+11
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 08:00:00+11
(1 row)