1. ホーム

[解決済み】PostgreSQLでタイムゾーンがある場合とない場合のタイムスタンプの違いについて

2022-04-19 20:52:39

質問

PostgreSQLでは、データ型が以下の場合、タイムスタンプの値の格納方法が異なります。 WITH TIME ZONE 対して WITHOUT TIME ZONE ? 簡単なテストケースで違いを説明できますか?

どのように解決するのですか?

その違いについては 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)