日付時刻式(Datetime Expression)は、日付時刻データ型の値を生成します。
日付時刻式
日付時刻式の構文は以下のとおりです:
{TIMESTAMP | DATE} string [ AT
{ LOCAL
| TIME ZONE { '[ + | - ] hh:mi'
| DBTIMEZONE
| SESSIONTIMEZONE
| 'time_zone_name'
}
} ]
TIMESTAMP または DATE に文字列リテラルを加えることで、TIMESTAMP または DATE タイプの値を生成できます。ただし、文字列の形式はシステム変数 NLS_TIMESTAMP_FORMAT および NLS_DATE_FORMAT と一致している必要があります。システム変数の値は、以下のSQLクエリで確認できます:
obclient> SELECT * from v$nls_parameters WHERE parameter like '%FORMAT';
+-------------------------+------------------------------+--------+
| PARAMETER | VALUE | CON_ID |
+-------------------------+------------------------------+--------+
| NLS_DATE_FORMAT | DD-MON-RR | 0 |
| NLS_TIMESTAMP_FORMAT | DD-MON-RR HH.MI.SSXFF AM | 0 |
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR | 0 |
+-------------------------+------------------------------+--------+
3 rows in set
例えば、システム変数 NLS_TIMESTAMP_FORMAT の値が DD-MON-RR HH.MI.SSXFF AM の場合、以下の式を使用して TIMESTAMP タイプの値を生成できます。
obclient> SELECT TIMESTAMP '2020-01-01 10:00:00' FROM DUAL;
+---------------------------------+
| TIMESTAMP'2020-01-0110:00:00' |
+---------------------------------+
| 01-JAN-20 10.00.00.000000000 AM |
+---------------------------------+
1 row in set
使用規則
AT LOCAL を指定した場合、データベースは現在のセッションのタイムゾーンを使用します。
AT TIME ZONE を指定した場合、タイムゾーンの返却ルールは以下のとおりです:
'[ + | - ] hh:mi':UTCからのオフセットとしてタイムゾーンを指定します。ここで、hhは時間数を、miは分を指定します。DBTIMEZONE:データベース作成時に設定されたデータベースのタイムゾーンを使用します。SESSIONTIMEZONE:デフォルトで作成された、または最近のAT LAST SESSIONステートメントで作成されたセッションのセッションタイムゾーンを使用します。'time_zone_name':タイムゾーン名を返します。有効なタイムゾーンの一覧は、辞書ビューV$TIMEZONE_NAMESで確認できます。
例
AT TIME ZONE を使用して、TIMESTAMP 型の値を別のタイムゾーンの値に変換します。
obclient> SELECT TIMESTAMP '2020-01-01 10:00:00' AT LOCAL FROM DUAL;
+--------------------------------------+
| TIMESTAMP'2020-01-0110:00:00'ATLOCAL |
+--------------------------------------+
| 01-JAN-20 10.00.00.000000 AM +08:00 |
+--------------------------------------+
1 row in set
obclient> SELECT TIMESTAMP '2020-01-01 10:00:00' AT TIME ZONE '-05:00' FROM DUAL;
+-------------------------------------------------+
| TIMESTAMP'2020-01-0110:00:00'ATTIMEZONE'-05:00' |
+-------------------------------------------------+
| 31-DEC-19 09.00.00.000000 PM -05:00 |
+-------------------------------------------------+
1 row in set