日付(DATE)リテラルは、文字列で指定するか、TO_DATE 関数を使用して文字または数字の値を日付値に変換できます。
日付リテラルのみが TO_DATE 式を使用して文字列に代わる値を指定できます。構文例は以下のとおりです:
TO_DATE('2020-03-25 11:05:00', 'YYYY-MM-DD HH24:MI:SS')
日付値をリテラルとして指定する場合は、グレゴリオ暦の日付値を使用する必要があります。また、ANSI 標準を使用して日付リテラルを指定することもできます。ANSI 日付リテラルには時刻情報が含まれず、YYYY-MM-DD の形式を使用する必要があります。構文例は以下のとおりです:
DATE '2020-03-25'
さらに、データベースのデフォルト日付値を使用して日付リテラルを指定することもできます。日付式でデフォルト値を使用すると、OceanBase データベースはデフォルトの日付形式の文字列を自動的に日付値に変換します。データベースのデフォルト日付形式は、初期化パラメータ NLS_DATE_FORMAT で指定され、以下の例ではデフォルト形式は DD-MON-RR です。
TO_DATE('25-FEB-20', 'DD-MON-RR')
時間成分を含まない日付値を指定した場合、デフォルトの時間は午前0時(24時間制では00:00:00、12時間制では12:00:00)です。指定した日付値に日付成分がない場合、デフォルトの日付は現在の月の1日です。
OceanBase データベースのデフォルト日付形式は DD-MON-RR です。時間値も表示する必要がある場合は、ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR HH24:MI:SS'; コマンドを実行して変数 NLS_DATE_FORMAT の値を変更できます。そのため、DATE 列をクエリする場合は、クエリ内で時間フィールドを指定するか、DATE 列の時間フィールドを午前0時に設定する必要があります。そうでない場合、データベースが期待されるクエリ結果を返さない可能性があります。
例えば、id 列と datecol 日付列を持つ Date_Literals テーブルを作成します。
CREATE TABLE Date_Literals (id NUMBER, datecol DATE);
テーブルに現在のセッションのシステム日付時刻 SYSDATE を挿入します。この例では、TRUNC 関数を使用して時間フィールドを午前0時に設定しています。TRUNC 関数は SYSDATE の日付部分を切り捨てるため、datecol 列の時間はデフォルトの午前0時に自動的に補完されます。
INSERT INTO Date_Literals VALUES (1,SYSDATE);
INSERT INTO Date_Literals VALUES (2,TRUNC(SYSDATE));
この時点でテーブル内のデータをクエリすると次のようになります。
obclient> SELECT * FROM Date_Literals;
+------+---------------------+
|ID | DATECOL |
+------+---------------------+
| 1 | 25-FEB-20 11:28:16 |
| 2 | 25-FEB-20 00:00:00 |
+------+---------------------+
2 rows in set
クエリに時間情報が含まれない場合、クエリ内で等しいまたは不等しい条件の代わりに、大なり小なりの条件を使用できます。例:
obclient> SELECT * FROM Date_Literals WHERE datecol > TO_DATE('2020-02-24', 'YYYY-MM-DD');
+------+---------------------+
| ID | DATECOL |
+------+---------------------+
| 1 | 25-FEB-20 11:28:16 |
| 2 | 25-FEB-20 00:00:00 |
+------+---------------------+
2 rows in set
等しい条件を使用する場合、クエリに時間情報が含まれないため、結果は時間情報が午前0時の日付のみが返されます。例:
obclient> SELECT * FROM Date_Literals WHERE datecol = TO_DATE('2020-02-25', 'YYYY-MM-DD');
+------+---------------------+
| ID | DATECOL |
+------+---------------------+
| 2 | 25-FEB-20 00:00:00 |
+------+---------------------+
2 rows in set
逆に、datecol 列の時間フィールドを除外して、日付フィールドのみをクエリすることもできます。例:
obclient> SELECT * FROM Date_Literals WHERE TRUNC(datecol) = DATE '2020-02-25';
+------+---------------------+
| id | detacol |
+------+---------------------+
| 1 | 25-FEB-20 11:28:16 |
| 2 | 25-FEB-20 00:00:00 |
+------+---------------------+
2 rows in set