web-dev-qa-db-ja.com

UTCでの日時-postgresに保存する方法は?

データを取得しています:UTCの日付と時刻、csvファイル形式で別々の列にあります。このゾーンを現在の夏、UTC + 2、およびおそらく他のいくつかのゾーンに住んでいる場所の日付と時刻に変換する必要があるので、私たちが話しているときにpostgresにデータを挿入するためのベストプラクティスは何ですか?データのタイプ。両方のデータを単一の列に配置するか、日付と時刻のタイプとして別々に保持する必要がありますか?.

11
mycupoftea

timestamptzを使用すると、タイムスタンプがUTCで保存されます。ロケールに従ってクライアントに表示します。

https://www.postgresql.org/docs/current/static/datatype-datetime.html

タイムゾーン付きのタイムスタンプの場合、内部に格納されている値は常にUTC(協定世界時、従来はグリニッジ標準時、GMT)になります。指定された明示的なタイムゾーンを持つ入力値は、そのタイムゾーンの適切なオフセットを使用してUTCに変換されます。入力文字列にタイムゾーンが指定されていない場合、システムのTimeZoneパラメーターで指定されたタイムゾーンにあると見なされ、タイムゾーンゾーンのオフセットを使用してUTCに変換されます。

タイムゾーン値を含むタイムスタンプが出力されると、常にUTCから現在のタイムゾーンゾーンに変換され、そのゾーンの現地時間として表示されます。別のタイムゾーンの時刻を表示するには、タイムゾーンを変更するか、AT TIME ZONE構文を使用します(セクション9.9.3を参照)。

updatedLukaszからの別の良い点で、私は言及しなければなりませんでした:

また、日付と時刻の両方を別々の列に格納する場合、日付のタイムゾーンを変更する場合は、それらを組み合わせてタイムスタンプに変換する必要があるという事実も、単一の列に有利です。

そうしないと、日付が「2017-12-31」になり、時刻が「23:01:01」になりますが、実際には他のタイムゾーンでは異なる時刻だけでなく、年と月、曜日がすべて異なる別の日付になります

別の更新Laurenz通知に従って、上記のドキュメントを忘れないでくださいquote指定された明示的なタイムゾーンを持つ入力値は、そのタイムゾーンに適切なオフセットを使用してUTCに変換されます。つまり、入力日付を慎重に管理する必要があります。例えば:

t=# create table t(t timestamptz);
CREATE TABLE
t=# set timezone to 'GMT+5';
SET
t=# insert into t select '2017-01-01 00:00:00';
INSERT 0 1
t=# insert into t select '2017-01-01 00:00:00' at time zone 'UTC';
INSERT 0 1
t=# insert into t select '2017-01-01 00:00:00+02';
INSERT 0 1
t=# select * from t;
           t
------------------------
 2017-01-01 00:00:00-05
 2017-01-01 05:00:00-05
 2016-12-31 17:00:00-05
(3 rows)
16
Vao Tsun