TIMESTAMP WITH TIME ZONEはTIMESTAMPの変種であり、その値にはタイムゾーン名またはタイムゾーンオフセットが含まれます。本記事では、TIMESTAMP WITH TIME ZONEデータ型の構文、パラメータ、および使用方法について説明します。
構文
TIMESTAMP [(scale)] WITH TIME ZONE
パラメータ
TIMESTAMP [(scale)] WITH TIME ZONE のしきい値と精度は scale の値によって決まり、その範囲は [0,9] です。最大値は9(ナノ秒、つまり秒の小数点以下9桁)で、最小値は0(秒、つまり秒の小数点以下0桁)で、デフォルト値は6です。
使用方法
TIMESTAMP [(scale)] WITH TIME ZONE は年、月、日、時、分、秒などの情報を格納し、しきい値と精度は scale の値によって決まります。TIMASTAMP [(scale)] と異なる点として、タイムゾーン情報も格納できるため、地理的に異なる地域間の日付時刻情報を格納するのによく使用されます。値の範囲は 0001-01-01 00:00:00.000000000 から 9999-12-31 23:59:59.999999999 です。
TIMESTAMP WITH TIME ZONE データ型のデフォルトの入出力形式は NLS_TIMESTAMP_TZ_FORMAT によって決定されます。デフォルトの形式を確認するには、次のSQLステートメントを実行します:
SELECT @@NLS_TIMESTAMP_TZ_FORMAT FROM DUAL;
実行結果は次のとおりです:
DD-MON-RR HH.MI.SSXFF AM TZR
データの形式をカスタマイズする必要がある場合は、変換関数を使用できます。データを挿入する際には、関数 TO_TIMESTAMP_TZ (char,fmt) を使用してデータの入力形式を指定できます。データをクエリする際には、関数 TO_CHAR (datetime,fmt) を使用してデータの出力形式を指定できます。これら2つの変換関数は、文字列をパラメータ fmt で定義された形式に変換します。fmt が指定されていない場合は、デフォルトの形式が使用されます。
タイムゾーンを挿入する際、OceanBaseデータベースはタイムゾーンオフセットとタイムゾーンエリア名を使用することをサポートしています:
タイムゾーンオフセット:グリニッジ標準時GMTとの差(時間と分)
タイムゾーンエリア名(TZR)およびタイムゾーン略称(TZD):国/都市のタイムゾーン略称
例
以下の例では、すべてTO_TIMESTAMP_TZ (char,fmt)を使用してタイムスタンプ値を入力します。
タイムゾーンオフセットを使用して数値を挿入する
obclient> SELECT TO_TIMESTAMP_TZ('2020-01-01 11:00:00 -05:00','YYYY-MM-DD HH:MI:SS TZH:TZM') FROM DUAL; +-------------------------------------------------------------------------+ | TO_TIMESTAMP_TZ('2020-01-0111:00:00-05:00','YYYY-MM-DDHH:MI:SSTZH:TZM') | +-------------------------------------------------------------------------+ | 01-JAN-20 11.00.00.000000000 AM AMERICA/LOS_ANGELES | +-------------------------------------------------------------------------+ 1 row in setタイムゾーンリージョン名とタイムゾーン略称を使用する
obclient> SELECT TO_TIMESTAMP_TZ('2020-01-01 11:00:00 America/Los_Angeles PST','YYYY-MM-DD HH:MI:SS TZR TZD') FROM DUAL; +-------------------------------------------------------------------------+ | TO_TIMESTAMP_TZ('2020-01-01 11:00:00 America/Los_Angeles PST','YYYY-MM-DDHH:MI:SS TZR TZD') | +-------------------------------------------------------------------------+ |01-JUN-20 11.00.00.000000000 AM America/Los_Angeles PST | +-------------------------------------------------------------------------+ 1 row in set
夏時間
OceanBaseデータベースは夏時間をサポートしており、タイムゾーン略称で夏時間情報を表します。例えば、America/Los_Angelesの場合、夏時間PDTは毎年3月の2日目の日曜日から11月の1日目の日曜日まで実行され、それ以外の時間帯はPSTです。挿入する値にタイムゾーンリージョン名のみが含まれている場合、OceanBaseデータベースは挿入された時間情報に基づいて現在挿入されているタイムゾーンリージョンが夏時間帯にあるかどうかを判断し、返される結果にタイムゾーン略称を含めて現在の時間が夏時間であることを示します。
例:
obclient> SELECT TO_TIMESTAMP_TZ('2020-02-01 11:00:00 America/Los_Angeles','YYYY-MM-DD HH:MI:SS TZR') FROM DUAL;
obclient> SELECT TO_TIMESTAMP_TZ('2020-06-01 11:00:00 America/Los_Angeles','YYYY-MM-DD HH:MI:SS TZR') FROM DUAL;
返される結果は次のとおりです:
01-JUN-20 11.00.00.000000000 AM America/Los_Angeles PST
01-JUN-20 11.00.00.000000000 AM America/Los_Angeles PDT