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 | timestamp without time zone | 指定されたタイムスタンプをタイムゾーンで変換 タイムゾーンの指定なしで、新しいタイムゾーンに移動します |
タイムゾーンなしのタイムスタンプATTIMEZONE | timestamp with time zone | 指定されたタイムスタンプをタイムゾーンなしで処理する 指定されたタイムゾーンにあるように |
time with time zone AT TIME 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
したがって、この例では、変換されるタイムゾーンとしてローカルタイムゾーンが想定されています。