Rozdíly jsou popsány v dokumentaci PostgreSQL pro typy data/času. Ano, zpracování TIME
nebo TIMESTAMP
se liší mezi jedním WITH TIME ZONE
nebo WITHOUT TIME ZONE
. Nemá vliv na způsob uložení hodnot; ovlivňuje to, jak jsou interpretovány.
Vliv časových pásem na tyto datové typy je popsán konkrétně v dokumentech. Rozdíl vyplývá z toho, co může systém o hodnotě rozumně vědět:
-
Pokud je součástí hodnoty časové pásmo, lze hodnotu v klientovi vykreslit jako místní čas.
-
Bez časového pásma jako součásti hodnoty je zřejmé výchozí časové pásmo UTC, takže se vykresluje pro toto časové pásmo.
Chování se liší v závislosti alespoň na třech faktorech:
- Nastavení časového pásma v klientovi.
- Datový typ (tj.
WITH TIME ZONE
neboWITHOUT TIME ZONE
) hodnoty. - Zda je hodnota uvedena s konkrétním časovým pásmem.
Zde jsou příklady pokrývající kombinace těchto faktorů:
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)