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