日付(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