Oracle 将日期存储在7- or 8-byte data structure 中,总是包含时间组件。
当您有一个日期TO_DATE( '21-JUN-2016', 'DD-MON-YYYY' ) 时,Oracle 将创建带有时间00:00:00 的日期。
如果你这样做:
WHERE TRAN_DATETIME BETWEEN TO_DATE( '21-JUN-2016 00:00:00', 'DD-MON-YYYY HH24:MI:SS' )
AND TO_DATE( '21-JUN-2016 00:00:00', 'DD-MON-YYYY HH24:MI:SS' )
那么你只会得到你想要的结果并且有时间组件00:00:00。
现在您可以使用TRUNC() 将时间组件设置为00:00:00:
WHERE TRUNC( TRAN_DATETIME ) BETWEEN DATE '2016-06-21' AND DATE '2016-06-21'
但是,如果 TRAN_DATETIME 列上有索引,则此查询将不会使用它(但是,它可以在 TRUNC( TRAN_DATETIME ) 上使用基于函数的索引)。
可以使用索引的解决方案是:
WHERE TRAN_DATETIME >= :start_date
AND TRAN_DATE < :end_date + INTERVAL '1' DAY
(假设 :start_date 和 :end_date 是传入的绑定变量,其时间分量为 00:00:00 - 这就是您正在做的事情)。
合并NVL 语句:
WHERE ( :start_date IS NULL OR TRAN_DATETIME >= :start_date )
AND ( :end_date IS NULL OR TRAN_DATE < :end_date + INTERVAL '1' DAY )