PostgreSQLでは、timezone()
を使用できます タイムスタンプを別のタイムゾーンに変換する関数。
構文
構文は次のようになります:
timezone(zone, timestamp)
zone
timestamp
が必要なタイムゾーンです 変換される引数。
得られる結果は、元のタイムスタンプ値にタイムゾーンが含まれているかどうか(およびその値が何であるか)によって異なります。
例1-元のタイムスタンプにタイムゾーンが含まれている場合
元のタイムスタンプにタイムゾーンが含まれている場合は、次のようになります。
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
結果:
2020-10-25 04:00:00
元のタイムスタンプにタイムゾーンが含まれている場合、timezone()
関数は、元のタイムスタンプ値を指定されたタイムゾーンにシフトし、タイムゾーンなしの値を返します。
入力タイムスタンプのタイムゾーンを変更するとどうなりますか。
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
結果:
2020-10-25 03:00:00
結果のタイムスタンプは、入力されたタイムゾーンに従ってシフトされます。
また、timestamp with time zone
を指定した場合 、ただし、元のタイムスタンプに実際にはタイムゾーンが含まれていない場合、元のタイムスタンプ値はローカルタイムゾーンにシフトされます。
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
結果:
2020-10-24 18:00:00
この場合、結果のタイムスタンプは6時間戻されています。これは、私のローカルタイムゾーンがインド/モーリシャスより6時間進んでいることを意味します。
入力値を直接選択することで、使用されたタイムゾーンオフセットを確認できます。
SELECT timestamp with time zone '2020-10-25 00:00:00';
結果:
2020-10-25 00:00:00+10
例2–元のタイムスタンプにタイムゾーンが含まれていない場合
元のタイムスタンプがない場合は次のようになります。 タイムゾーンを含めます。
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
結果:
2020-10-25 06:00:00+10
元のタイムスタンプにタイムゾーンが含まれていない場合、結果は現在のTimeZone
を使用して表示されます 設定とタイムゾーンオフセットが追加されます。
これは、timestamp without time zone
を指定するたびに適用されます 、タイムスタンプに実際にタイムゾーンオフセットが含まれている場合でも。
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
結果:
2020-10-25 06:00:00+10
timestamp without time zone
だけを選択すると、これは予想されることです。 値、これは私が得るものです:
SELECT timestamp without time zone '2020-10-25 00:00:00+12';
結果:
2020-10-25 00:00:00
例3– localtimestamp
localtimestamp
を使用しましょう 自分のタイムゾーンの現在のタイムスタンプと、timezone()
を使用した後の結果のタイムスタンプとの比較を実行する関数 別のタイムゾーンに変換する関数。
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
結果:
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
localtimestamp
関数はタイムスタンプを返します データ型。暗黙の「タイムゾーンなし」が付属しています。つまり、タイムスタンプ およびタイムゾーンのないタイムスタンプ 同じことです。
前に示したように、元のタイムスタンプにタイムゾーンが指定されていない場合、現在のTimeZone
設定が使用され、結果に追加されます。これが、localtimestamp
を使用したときに得られるものです。 。
ちなみに、この例では\x
を使用しました 読みやすくするために、拡張表示/垂直出力を使用して結果を表示します。
例4– current_timestamp
それでは、current_timestamp
を使用しましょう localtimestamp
の代わりに関数 。
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
結果(垂直出力を使用):
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
今回は、タイムゾーンオフセットが元のタイムスタンプに追加され、timezone()
結果には含まれなくなりました。
current_timestamp
が原因で、この結果が得られます 関数はタイムゾーン付きのタイムスタンプを返します データ型。
例5–時間値の使用
timezone()
関数はtime
でも機能します 値(time with time zone
およびtime without time zone
。
ただし、time with time zone
で使用する場合 値の場合、タイムゾーンオフセットが結果に追加されます。
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
結果(垂直出力を使用):
timezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
完全を期すために、time without time zone
を使用した同じ値を次に示します。 データ型。
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
結果(垂直出力を使用):
timezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
ローカルタイムゾーンを確認する
自分のローカルタイムゾーンを確認する場合は、SHOW TIMEZONE
を実行します 。
そのコマンドを実行すると、次のようになります。
SHOW TIMEZONE;
結果:
Australia/Brisbane
タイムゾーンオフセットを確認する
上記の知識があれば、pg_timezone_names
にクエリを実行して、2つのタイムゾーンオフセットを確認できます。 ビュー。
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
結果(垂直出力を使用):
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Postgresでタイムゾーンを返すためのその他のオプションと例については、PostgreSQLでサポートされているタイムゾーンのリストを返すを参照してください。