はい、PostgreSQLはすべてのタイムスタンプを内部的にUTCとして保存します。 timestamp with time zone
の場合、タイムゾーンオフセットはUTCの時刻を調整するためにのみ適用されますが、明示的には格納されません。
私はタイムゾーン文字列を保存しないでください(正確ではない)。これは、夏時間やその他の国際時間枠の奇妙な部分を考慮する必要があるため、後で高価な計算を必要とする可能性があります。
あなたが間隔としてタイムゾーンオフセットを格納することができるいずれかの私はこのrelated answerで実証ように(整数として4バイトを要する)または秒の数値量(12バイトをとります)。
または、すでに提案したように:UTCタイムスタンプに加えてローカルタイムスタンプを保存してください(8バイト)。それはあなたの仕事を簡単にするでしょう。次のデモを考えてみましょう::
-- DROP TABLE tbl;
CREATE TEMP TABLE tbl (id int, ts_tz timestamp with time zone, ts timestamp);
INSERT INTO tbl VALUES
(1,'2012-1-1 00:00+01','2012-1-1 00:00+01')
,(2,'2012-1-1 00:00+02','2012-1-1 00:00+02')
,(3,'2012-1-1 00:01+03','2012-1-1 00:01+03')
,(4,'2012-1-1 00:02+04','2012-1-1 00:02+04');
質問1のためのクエリ:質問2について
SELECT *
FROM tbl
WHERE ts = '2012-1-1 00:00'::timestamp;
id | ts_tz | ts
----+------------------------+---------------------
1 | 2012-01-01 00:00:00+01 | 2012-01-01 00:00:00
2 | 2011-12-31 23:00:00+01 | 2012-01-01 00:00:00
問合せ:
SELECT *
FROM tbl
ORDER BY ts_tz;
id | ts_tz | ts
----+------------------------+---------------------
4 | 2011-12-31 21:02:00+01 | 2012-01-01 00:02:00
3 | 2011-12-31 22:01:00+01 | 2012-01-01 00:01:00
2 | 2011-12-31 23:00:00+01 | 2012-01-01 00:00:00
1 | 2012-01-01 00:00:00+01 | 2012-01-01 00:00:00
トリッキーな部分このソリューションでは、入力することであってもよいですローカルタイムスタンプ。すべてのデータがローカルに入力されている限り、簡単です。しかし、たとえばロサンゼルスにニューヨークのデータを入力する場合は、考慮する必要があります。そのためAT TIME ZONE
constructを使用してください:私は、入力としてタイムゾーンとタイムスタンプを使用する方法
SELECT ('2012-1-1 00:00+00' AT TIME ZONE 'America/New_York')::timestamp
, ('2012-1-1 00:00+00' AT TIME ZONE 'America/Los_Angeles')::timestamp
timezone | timezone
---------------------+---------------------
2011-12-31 19:00:00 | 2011-12-31 16:00:00
注意を。 AT TIME ZONE
は、タイムゾーンの有無にかかわらずタイムスタンプの結果が異なります。
文字列として日付/時刻を格納するのは非常に汚い方法であり、避けてください。 – Skuld
データベースの日付/時刻フィールドは常に文字列ではありませんか? そして、私はあなたの質問で比較することに同意しますが、ISO 8601の文字列として格納する必要がない場合は、問題ありません。 –
postgresqlが他のデータベースエンジンと非常に異なる何かをしない限り、datetimeは決して文字列として格納されません過去の特定の日付/時刻から定義された時間量を表す整数値) – Skuld