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

PostgreSQLでのATTIMEZONEの動作

    PostgreSQLでは、AT TIME ZONEを使用できます タイムスタンプを別のタイムゾーンに変換する句。

    構文

    次の3つのバリエーションのいずれかで使用できます。

    timestamp with time zone AT TIME ZONE zone
    timestamp without time zone AT TIME ZONE zone
    time with time zone AT TIME ZONE zone

    zone 左側の値を変換するタイムゾーンです。

    明確にするために、3つのバリアントの唯一の違いは、変換されるタイムスタンプのデータ型にあります。

    3つのデータ型は次のとおりです。

    • timestamp with time zone
    • timestamp without time zone
    • time with time zone

    得られる結果はデー​​タ型によって異なります。

    次の表は、各バリアントが生成する結果の概要を示しています。

    表現 リターンタイプ 説明
    タイムゾーン付きタイムスタンプATTIMEZONE zone timestamp without time zone 指定されたタイムスタンプをタイムゾーンで変換 タイムゾーンの指定なしで、新しいタイムゾーンに移動します
    タイムゾーンなしのタイムスタンプATTIMEZONE zone timestamp with time zone 指定されたタイムスタンプをタイムゾーンなしで処理する 指定されたタイムゾーンにあるように
    time with time zone AT TIME ZONE zone time with time zone 指定された時間をタイムゾーンで変換 新しいタイムゾーンへ

    バリアント1

    timestamp with time zoneを変換すると次のようになります 価値。

    SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

    結果:

    2025-11-20 02:00:00

    元のタイムスタンプがtimestamp with time zoneの場合 値の場合、指定されたタイムゾーンにシフトされ、タイムゾーンオフセットなしで結果が返されます。

    入力値のタイムゾーンオフセットを変更するとどうなりますか。

    SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

    結果:

    2025-11-20 01:00:00

    結果のタイムスタンプは、入力されたタイムゾーンに従ってシフトされます。

    また、timestamp with time zoneを指定した場合 、ただし、元のタイムスタンプに実際にはタイムゾーンが含まれていない場合は、ローカルタイムゾーンが想定されます。

    SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

    結果:

    2025-11-19 16:00:00

    この場合、結果のタイムスタンプは8時間戻されています。これは、私のローカルタイムゾーンがアフリカ/カイロより8時間進んでいることを意味します。

    入力値を直接選択することで、使用されたタイムゾーンオフセットを確認できます。

    SELECT timestamp with time zone '2025-11-20 00:00:00';

    結果:

    2025-11-20 00:00:00+10

    バリアント2

    元のタイムスタンプがtimestamp without time zoneを使用するとどうなりますか? 価値。

    言い換えれば、そうではありません タイムゾーンを含めます。

    SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

    結果:

    2025-11-20 08:00:00+10

    元のタイムスタンプにタイムゾーンが含まれていない場合、結果は現在のTimeZoneを使用して表示されます 設定とタイムゾーンオフセットが追加されます。

    これは、timestamp without time zoneを指定するたびに適用されます 、タイムスタンプに実際にタイムゾーンオフセットが含まれている場合でも。

    SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

    結果:

    2025-11-20 08:00:00+10

    timestamp without time zoneだけを選択すると、これは予想されることです。 値、これは私が得るものです:

    SELECT timestamp without time zone '2025-11-20 00:00:00+12';

    結果:

    2025-11-20 00:00:00

    バリアント3

    元のタイムスタンプがtime with time zoneを使用するとどうなるかを次に示します。 値。

    SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

    結果:

    02:00:00+02

    指定されたtime with time zone 値を新しいタイムゾーンに追加し、タイムゾーンオフセットを結果に追加します。

    入力値のタイムゾーンオフセットを変更するとどうなりますか。

    SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

    結果:

    01:00:00+02

    結果のタイムスタンプは、入力されたタイムゾーンに従ってシフトされます。

    また、time with time zoneを指定した場合 、ただし、元のタイムスタンプには実際にはタイムゾーンが含まれていないため、ローカルタイムゾーンが想定されます。

    SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

    結果:

    16:00:00+02

    この場合、結果のタイムスタンプは8時間戻されています(私のローカルタイムゾーンはアフリカ/カイロより8時間進んでいるため)。

    入力値を直接選択することで、使用されたタイムゾーンオフセットを確認できます。

    SELECT time with time zone '00:00:00';

    結果:

    00:00:00+10

    タイムゾーンのない時間

    Postgresのドキュメントにはtime without time zoneは含まれていませんが バリアント、とにかくここに例があります。

    SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

    結果:

    16:00:00+02

    したがって、この例では、変換されるタイムゾーンとしてローカルタイムゾーンが想定されています。


    1. オートコンプリートフィールド用の同様のUTF-8文字列

    2. prepareStatement構文エラー

    3. MySQL列をAUTO_INCREMENTに変更します

    4. MySQLデータベース全体を削除する方法