从您的输出判断,您已将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>
但我们还是只得到一排。这是因为START_DATE有一个时间元素。如果我们不指定时间组件,Oracle将其默认为午夜。这对于从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>
编辑
如果你不能传递时间组件有几个选择。一个是更改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)