Разликите са обхванати в документацията на PostgreSQL за типовете дата/час. Да, лечението на TIME
или TIMESTAMP
се различава между един WITH TIME ZONE
или WITHOUT TIME ZONE
. Това не влияе върху начина, по който се съхраняват стойностите; това се отразява на начина, по който се тълкуват.
Ефектите на часовите зони върху тези типове данни са обхванати специално в документите. Разликата произтича от това, което системата може разумно да знае за стойността:
-
С часова зона като част от стойността, стойността може да бъде изобразена като местно време в клиента.
-
Без часова зона като част от стойността, очевидната часова зона по подразбиране е UTC, така че се изобразява за тази часова зона.
Поведението се различава в зависимост от поне три фактора:
- Настройката на часовата зона в клиента.
- Типът данни (т.е.
WITH TIME ZONE
). илиWITHOUT TIME ZONE
) от стойността. - Дали стойността е посочена с определена часова зона.
Ето примери, обхващащи комбинациите от тези фактори:
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)