出力から判断すると、START_DATEをタイムスタンプとして定義したように見えます。それが通常の日付である場合、Oracleは暗黙の変換を処理できます。ただし、これらの文字列を日付として明示的にキャストする必要はありません。
SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
2 /
Session altered.
SQL>
SQL> select * from t23
2 where start_date between '15-JAN-10' and '17-JAN-10'
3 /
no rows selected
SQL> select * from t23
2 where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
3 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
SQL>
しかし、それでも1行しか取得できません。これは、START_DATEに時間要素があるためです。時間コンポーネントを指定しない場合、Oracleはデフォルトで深夜に設定します。 fromには問題ありません BETWEEN
の側面 ただし、までは対象外です サイド:
SQL> select * from t23
2 where start_date between to_date('15-JAN-10')
3 and to_date('17-JAN-10 23:59:59')
4 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
Product 1 17-JAN-10 04.31.32.000
SQL>
編集
時間コンポーネントを渡すことができない場合は、いくつかの選択肢があります。 1つは、WHERE句を変更して、基準から時間要素を削除することです。
where trunc(start_date) between to_date('15-JAN-10')
and to_date('17-JAN-10')
これは、START_DATEのbツリーインデックスを失格にするため、パフォーマンスに影響を与える可能性があります。代わりに、関数ベースのインデックスを作成する必要があります。
または、コードの日付に時間要素を追加することもできます:
where start_date between to_date('15-JAN-10')
and to_date('17-JAN-10') + (86399/86400)
これらの問題のために、多くの人はbetween
の使用を避けることを好みます 次のように日付の境界を確認します:
where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')