違いは、日付/時刻タイプのPostgreSQLドキュメントで説明されています。はい、TIME
の扱い またはTIMESTAMP
1つのWITH TIME ZONE
で異なります またはWITHOUT TIME ZONE
。値の保存方法には影響しません。解釈方法に影響します。
これらのデータ型に対するタイムゾーンの影響については、特にドキュメントで説明されています。違いは、システムが値について合理的に知ることができるものから生じます:
-
値の一部としてタイムゾーンを使用すると、値をクライアントで現地時間としてレンダリングできます。
-
値の一部としてタイムゾーンがない場合、明らかなデフォルトのタイムゾーンはUTCであるため、そのタイムゾーンに対してレンダリングされます。
動作は、少なくとも3つの要因によって異なります。
- クライアントのタイムゾーン設定。
- データ型(つまり、
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)