sql >> データベース >  >> RDS >> PostgreSQL

タイムゾーンのない時間とタイムゾーン名からタイムゾーンのある時間を取得する

    警告: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の時間の結果をどのようにしますか?


    1. xamppのmysqlは5秒で開始および停止します

    2. mysql:選択した日の次の日付を取得するにはどうすればよいですか?

    3. DATEDIFF()の例– MySQL

    4. PostgreSQLのDESCRIBETABLEと同等