Forskellene er dækket af PostgreSQL-dokumentationen for dato/tidstyper. Ja, behandlingen af TIME
eller TIMESTAMP
adskiller sig mellem én WITH TIME ZONE
eller WITHOUT TIME ZONE
. Det påvirker ikke, hvordan værdierne opbevares; det påvirker, hvordan de fortolkes.
Effekterne af tidszoner på disse datatyper er specifikt dækket i dokumenterne. Forskellen skyldes, hvad systemet med rimelighed kan vide om værdien:
-
Med en tidszone som en del af værdien kan værdien gengives som en lokal tid i klienten.
-
Uden en tidszone som en del af værdien er den åbenlyse standardtidszone UTC, så den gengives for denne tidszone.
Adfærden varierer afhængigt af mindst tre faktorer:
- Tidszoneindstillingen i klienten.
- Datatypen (dvs.
WITH TIME ZONE
ellerWITHOUT TIME ZONE
) af værdien. - Om værdien er angivet med en bestemt tidszone.
Her er eksempler, der dækker kombinationerne af disse 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)