Skillnaderna täcks av PostgreSQL-dokumentationen för datum/tidstyper. Ja, behandlingen av TIME
eller TIMESTAMP
skiljer sig mellan en WITH TIME ZONE
eller WITHOUT TIME ZONE
. Det påverkar inte hur värdena lagras; det påverkar hur de tolkas.
Effekterna av tidszoner på dessa datatyper behandlas specifikt i dokumenten. Skillnaden beror på vad systemet rimligen kan veta om värdet:
-
Med en tidszon som en del av värdet kan värdet återges som en lokal tid i klienten.
-
Utan en tidszon som en del av värdet är den uppenbara standardtidszonen UTC, så den återges för den tidszonen.
Beteendet skiljer sig beroende på minst tre faktorer:
- Tidszonsinställningen i klienten.
- Datatypen (dvs.
WITH TIME ZONE
ellerWITHOUT TIME ZONE
) av värdet. - Om värdet är specificerat med en viss tidszon.
Här är exempel som täcker kombinationerna av dessa faktorer:
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)