これは本当に簡単なはずですが、私はそれで恥ずかしいほどのトラブルを抱えています.
PostgreSQL 9.1 ではDATE
、DB に として格納されているフィールドをTIMESTAMPTZ
、その日付の午前 0 時 UTC を表すものとして解釈する必要があります。誰かがやって来て、何が起こっているのかを見て、理解できるように、きれいで読みやすい方法でそれを行いたいと思います。
これまでに見つけた唯一の方法は、どちらも非常に醜いものです。それを に変換し、それを UTC であるかのように解釈して、そこからTIMESTAMP WITHOUT TIME ZONE
を作成します。TIMESTAMP WITH TIME ZONE
SELECT CAST(DATE '2012-01-01' AS TIMESTAMP WITHOUT TIME ZONE) AT TIME ZONE 'utc'
他の方法はもっと悪いです:
('2012-01-01'::date)::timestamptz - (current_timestamp AT TIME ZONE 'UTC' - current_timestamp)
日付を現地時間の午前 0 時のタイムスタンプに変換してから、タイム ゾーン オフセットを減算します。そのオフセットをネイティブに間隔として取得する方法が見つからなかったので (クレイジーに思えます) current_timestamp
、現地時間とcurrent_timestamp
UTC を比較して取得しました。
私が解決できる唯一の他の方法はextract
、日付の部品を入手して、それらから新しい部品を組み立てるtimestamptz
ことでした。私はそれを見せることさえしません、それはあまりにも醜いです.
どちらのアプローチも、あらゆる種類の奇妙で間違っていると感じます。その日の真夜中の UTC のDATE
aから a に読みやすく、簡単に理解できる方法で変換するための正気な方法 (標準またはいいえ) はありますか?timestamptz
私は次のようなものを探しています(架空の、機能しません)
'2012-01-01'::date AS TIMESTAMPTZ IN TIME ZONE '00:00';
また
to_timestamp('2012-01-01'::date, '00:00'::time, 'UTC');
私が見逃している愚かなことを指摘してください。
extract(epoch from $1)
表示時だけでなく、変換された日付がどこにあるのか、日付が内部的に本当に正しいことを確認するためにテストしていることに注意してください$1
。