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

Unterschied zwischen Zeitstempeln mit/ohne Zeitzone in PostgreSQL

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 oder WITHOUT 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)