PostgreSQLのタイムゾーン付き/なしのタイムスタンプの違い 質問する

PostgreSQLのタイムゾーン付き/なしのタイムスタンプの違い 質問する

PostgreSQL では、データ型が の場合とWITH TIME ZONEの場合でタイムスタンプ値の保存方法が異なりますかWITHOUT TIME ZONE? 簡単なテスト ケースで違いを説明できますか?

ベストアンサー1

違いについては以下で説明されています。PostgreSQLの日付/時刻型に関するドキュメントTIMEはい、または の扱いは、とTIMESTAMPの間で異なります。値の格納方法には影響しませんが、値の解釈方法には影響します。WITH TIME ZONEWITHOUT 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)

おすすめ記事