PostgreSQL では、データ型が の場合とWITH TIME ZONE
の場合でタイムスタンプ値の保存方法が異なりますかWITHOUT TIME ZONE
? 簡単なテスト ケースで違いを説明できますか?
ベストアンサー1
違いについては以下で説明されています。PostgreSQLの日付/時刻型に関するドキュメントTIME
はい、または の扱いは、とTIMESTAMP
の間で異なります。値の格納方法には影響しませんが、値の解釈方法には影響します。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)