出力から判断すると、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 はデフォルトで午前 0 時に設定します。これはfrom側では問題ありBETWEEN
ませんが、until側では問題ありません。
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')