CONVERT_TIMEZONE 関数
CONVERT_TIMEZONE は、タイムスタンプのタイムゾーンを別のタイムゾーンに変換します。この関数は夏時間に合わせて自動的に調整されます。
構文
CONVERT_TIMEZONE( ['source_timezone',] 'target_timezone', 'timestamp')
引数
- source_timezone
-
(オプション) 現在のタイムスタンプのタイムゾーン。デフォルトは UTC です。詳細については、「タイムゾーンの使用上の注意」を参照してください。
- target_timezone
-
新しいタイムスタンプのタイムゾーン。詳細については、「タイムゾーンの使用上の注意」を参照してください。
- timestamp
-
タイムスタンプの列、あるいは暗黙的にタイムスタンプに変換される式。
戻り型
TIMESTAMP
タイムゾーンの使用上の注意
source_timezone または target_timezone のいずれかをタイムゾーン名 (「Africa/Kampala」または「Singapore」など) またはタイムゾーンの略名 (「UTC」または「PDT」など) として指定できます。タイムゾーン名を名前に変換したり、略語を略語に変換したりする必要はありません。例えば、ソースタイムゾーン名「Singapore」からタイムスタンプを選択して、タイムゾーンの略語「PDT」のタイムスタンプに変換できます。
注記
タイムゾーン名またはタイムゾーンの略名を使用した結果は、地域の季節ごとの時間 (夏時間など) に応じて異なる場合があります。
タイムゾーン名の使用
タイムゾーン名の完全なリストの最新版を表示するには、次のコマンドを実行します。
select pg_timezone_names();
各行には、タイムゾーン名、略名、UTC オフセット、およびタイムゾーンがサマータイムを採用しているかどうかのインジケーター (t
または f
) がカンマで区切られた文字列が含まれます。例えば、次のスニペットは、結果として 2 行が表示されます。最初の行はタイムゾーン Europe/Paris
で略名は CET
、UTC からのオフセットは 01:00:00
です。f
によって夏時間が適用されないことが示されています。2 行目はタイムゾーン Israel
で略名は IST
、UTC からのオフセットは 02:00:00
です。f
によって夏時間が適用されないことが示されています。
pg_timezone_names
-----------------
(Europe/Paris,CET,01:00:00,f)
(Israel,IST,02:00:00,f)
SQL ステートメントを実行してリスト全体を取得し、タイムゾーン名を検索します。約 600 行が返されます。返されるタイムゾーン名は大文字のイニシャルや頭字語 (例: GB、PRC、ROK) になっていますが、CONVERT_TIMEZONE 関数ではこれらはタイムゾーンの省略形ではなくタイムゾーン名として扱われます。
タイムゾーン名を使用してタイムゾーンを指定する場合、CONVERT_TIMEZONE は自動的に夏時間 (DST)、または 'timestamp' によって指定される日付と時刻で有効なその他の現地の季節の慣習 (サマータイム、標準時、冬時間) を調整します。例えば、'Europe/London' は冬季は UTC を表し、夏季は 1 時間を追加します。
タイムゾーンの略名の使用
タイムゾーン略名の完全なリストの最新版を表示するには、次のコマンドを実行します。
select pg_timezone_abbrevs();
結果には、タイムゾーン略名、UTC オフセット、およびタイムゾーンがサマータイムを採用しているかどうかのインジケーター (t
または f
) がカンマで区切られた文字列が含まれます。たとえば、次のスニペットでは、結果として 2 行が表示されます。最初の行には、UTC からのオフセットは -07:00:00
の太平洋夏時間の略語 PDT
が含まれており、t
は夏時間を採用していることがわかります。最初の行には、UTC からのオフセットは -08:00:00
の太平洋標準時間の略語 PST
が含まれており、f
は夏時間を採用していないことがわかります。
pg_timezone_abbrevs
--------------------
(PDT,-07:00:00,t)
(PST,-08:00:00,f)
SQL ステートメントを実行してリスト全体を取得し、そのオフセットとサマータイムインジケーターに基づいて略語を検索します。約 200 行が返されます。
タイムゾーンの略名は、UTC からの固定オフセットを表します。タイムゾーンの略名を使用してタイムゾーンを指定する場合、CONVERT_TIMEZONE は UTC からの固定オフセットを使用し、現地の季節の慣習を調整しません。
POSIX スタイル形式の使用
POSIX スタイルのタイムゾーン仕様は STDoffset または STDoffsetDST の形式であり、これらの STD はタイムゾーンの省略形、offset は UTC から西方向への時間単位の数値オフセット、および DST はオプションの夏時間ゾーンの省略形です。夏時間は、特定のオフセットより 1 時間早いことを前提としています。
POSIX スタイルのタイムゾーン形式では、グリニッジから西方向に正のオフセットが使用されます。これは、グリニッジから東方向に正のオフセットを使用する ISO-8601 規則とは対照的です。
POSIX スタイルのタイムゾーンの例を以下に示します。
-
PST8
-
PST8PDT
-
EST5
-
EST5EDT
注記
Amazon Redshift は、POSIX スタイルのタイムゾーン仕様を検証しないため、タイムゾーンを無効な値に設定する可能性があります。例えば、次のコマンドはタイムゾーンを無効な値に設定しますが、エラーを返しません。
set timezone to ‘xxx36’;
例
多くの例では、TICKIT サンプルデータセットを使用しています。詳細については、「サンプルデータベース」を参照してください。
次の例は、タイムスタンプ値をデフォルトの UTC タイムゾーンから PST に変換します。
select convert_timezone('PST', '2008-08-21 07:23:54');
convert_timezone ------------------------ 2008-08-20 23:23:54
次の例は、LISTTIME 列のタイムスタンプ値をデフォルトの UTC タイムゾーンから PST に変換します。タイムスタンプが夏時間の期間内であっても、変換後のタイムゾーンが略名 (PST) で指定されているため、標準時間に変換されます。
select listtime, convert_timezone('PST', listtime) from listing where listid = 16;
listtime | convert_timezone --------------------+------------------- 2008-08-24 09:36:12 2008-08-24 01:36:12
次の例は、タイムスタンプの LISTTIME 列をデフォルトの UTC タイムゾーンから US/Pacific タイムゾーンに変換します。変換後のタイムゾーンはタイムゾーン名で指定されており、タイムスタンプは夏時間の期間内であるため、この関数は夏時間を返します。
select listtime, convert_timezone('US/Pacific', listtime) from listing where listid = 16;
listtime | convert_timezone --------------------+--------------------- 2008-08-24 09:36:12 | 2008-08-24 02:36:12
次の例は、タイムスタンプの文字列を EST から PST に変換します。
select convert_timezone('EST', 'PST', '20080305 12:25:29');
convert_timezone ------------------- 2008-03-05 09:25:29
次の例は、変換後のタイムゾーンがタイムゾーン名 (America/New_York) で指定されており、タイムスタンプが標準時間の期間内にあるため、タイムスタンプを米国東部標準時に変換します。
select convert_timezone('America/New_York', '2013-02-01 08:00:00');
convert_timezone --------------------- 2013-02-01 03:00:00 (1 row)
次の例は、変換後のタイムゾーンがタイムゾーン名 (America/New_York) で指定されており、タイムスタンプが夏時間の期間内にあるため、タイムスタンプを米国東部夏時間に変換します。
select convert_timezone('America/New_York', '2013-06-01 08:00:00');
convert_timezone --------------------- 2013-06-01 04:00:00 (1 row)
次の例は、オフセットの使用を示しています。
SELECT CONVERT_TIMEZONE('GMT','NEWZONE +2','2014-05-17 12:00:00') as newzone_plus_2, CONVERT_TIMEZONE('GMT','NEWZONE-2:15','2014-05-17 12:00:00') as newzone_minus_2_15, CONVERT_TIMEZONE('GMT','America/Los_Angeles+2','2014-05-17 12:00:00') as la_plus_2, CONVERT_TIMEZONE('GMT','GMT+2','2014-05-17 12:00:00') as gmt_plus_2;
newzone_plus_2 | newzone_minus_2_15 | la_plus_2 | gmt_plus_2 ---------------------+---------------------+---------------------+--------------------- 2014-05-17 10:00:00 | 2014-05-17 14:15:00 | 2014-05-17 10:00:00 | 2014-05-17 10:00:00 (1 row)