警告:PostgreSQL初心者(質問へのコメントを参照してください!)。タイムゾーンについては少し知っているので、意味があることはわかっています。 尋ねる。
AT TIME ZONE
に関しては、これは基本的にサポートされていない状況であるように見えます(残念ながら) 。 AT TIMEZONE> ドキュメントには、「入力」値タイプのみが記載された表が記載されています。
- タイムゾーンのないタイムスタンプ
- タイムゾーン付きのタイムスタンプ
- タイムゾーンのある時間
必要なものがありません:なしの時間 タイムゾーン。あなたが求めているのはやや 論理的ですが、日付によって異なります...異なるタイムゾーンでは、日付に応じてオフセットが異なる可能性があるためです。たとえば、12:00:00ヨーロッパ/ロンドン may 冬か夏かによって、12:00:00 UTCを意味する場合もあれば、11:00:00UTCを意味する場合もあります。
私のシステムでは、システムのタイムゾーンをAmerica / Reginaに設定したので、クエリ
SELECT ('2011-11-22T12:00:00'::TIMESTAMP WITHOUT TIME ZONE)
AT TIME ZONE 'America/Vancouver'
2011-11-22 14:00:00-06
をくれます 結果として。それは理想的ではありません 、しかしそれは少なくともその瞬間の時点を与える(私は思う)。クライアントライブラリでそれを取得した場合、または別のTIMESTAMP WITH TIME ZONE
と比較した場合、私は信じています。 -正しい結果が得られます。 システムを使用するのはテキスト変換だけです 出力のタイムゾーン。
それで十分でしょうか? SCHEDULES.time
を変更できますか フィールドをTIMESTAMP WITHOUT TIME ZONE
にする フィールド、または(クエリ時に)フィールドからの時刻と日付を組み合わせて、タイムゾーンのないタイムスタンプを作成しますか?
編集:「現在の日付」に満足している場合は、見た目 クエリを次のように変更できます:
SELECT (current_date + SCHEDULES.time) AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID
もちろん、現在のシステム 日付は、ローカルタイムゾーンの現在の日付と同じではない場合があります 。私は考えます これでその部分が修正されます...
SELECT ((current_timestamp AT TIME ZONE USERS.tz)::DATE + schedules.time)
AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID
言い換えれば:
- 現在の瞬間をとる
- ユーザーのタイムゾーンで現地の日付/時刻を計算します
- その日付を取ります
- その日付にスケジュール時間を追加して、
TIMESTAMP WITHOUT TIME ZONE
を取得します。 -
AT TIME ZONE
を使用する そのローカルの日付/時刻にタイムゾーンを適用するには
もっと良い方法があると確信していますが、考えます それは理にかなっています。
ただし、場合によっては失敗する可能性があることに注意してください。
- 時計が01:00から02:00にスキップして、01:30がまったく発生しない日の、01:30の時間の結果をどのようにしますか?
- 時計が02:00から01:00に戻って、01:30が2回発生する日の、01:30の時間の結果をどのようにしますか?