Różnice zostały omówione w dokumentacji PostgreSQL dla typów daty/godziny. Tak, traktowanie TIME
lub TIMESTAMP
różni się między jednym WITH TIME ZONE
lub WITHOUT TIME ZONE
. Nie wpływa na sposób przechowywania wartości; wpływa to na sposób ich interpretacji.
Wpływ stref czasowych na te typy danych jest szczegółowo omówiony w dokumentach. Różnica wynika z tego, co system może racjonalnie wiedzieć o wartości:
-
Ze strefą czasową jako częścią wartości, wartość może być renderowana jako czas lokalny w kliencie.
-
Bez strefy czasowej jako części wartości, oczywista domyślna strefa czasowa to UTC, więc jest renderowana dla tej strefy czasowej.
Zachowanie różni się w zależności od co najmniej trzech czynników:
- Ustawienie strefy czasowej w kliencie.
- Typ danych (np.
WITH TIME ZONE
lubWITHOUT TIME ZONE
) wartości. - Czy wartość jest określona w określonej strefie czasowej.
Oto przykłady obejmujące kombinacje tych czynników:
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)