为了从索引中获益,是否有办法避免在sql中使用TRUNC(Date)?

为了从索引中获益,是否有办法避免在sql中使用TRUNC(Date)?,sql,oracle,Sql,Oracle,我有一个表BOOKING\u DETAILS,其中DEFINITE\u DATE是一个带有“DATE”类型的列。(DB是Oracle 12 c)。此外,DEFINITE\u DATE列也被索引。我希望优化以下查询,以便使用为DEFINITE\u DATE创建的索引 我该怎么做 select * from BOOKING_DETAILS where trunc(DEFINITE_DATE) = trunc(TO_DATE('2018-10-26', 'YYYY-MM-DD')) 您可以

我有一个表
BOOKING\u DETAILS
,其中
DEFINITE\u DATE
是一个带有“DATE”类型的列。(DB是Oracle 12 c)。此外,
DEFINITE\u DATE
列也被索引。我希望优化以下查询,以便使用为
DEFINITE\u DATE
创建的索引

我该怎么做

select * 
  from BOOKING_DETAILS 
 where trunc(DEFINITE_DATE) = trunc(TO_DATE('2018-10-26', 'YYYY-MM-DD'))

您可以在
WHERE
子句中使用between条件:

select *
from BOOKING_DETAILS 
where DEFINITE_DATE >= date '2018-10-26' and
      DEFINITE_DATE < date '2018-10-27';
选择*
从预订详情
其中确定日期>=日期“2018-10-26”和
确定日期<日期'2018-10-27';

这将返回确定日期为2018年10月26日的所有记录。上面的
WHERE
子句是可搜索的,因为它允许Oracle在
DEFINITE\u DATE
上使用索引,如果它存在的话。

如果您不想在
trunc(DEFINITE\u DATE)
上创建索引并使用现有查询,您可以

select * 
  from BOOKING_DETAILS 
 where DEFINITE_DATE >= TO_DATE('2018-10-26', 'YYYY-MM-DD') 
   and DEFINITE_DATE < TO_DATE('2018-10-26', 'YYYY-MM-DD') + INTERVAL '1' DAY
选择*
从预订详情
其中确定日期>=截止日期('2018-10-26','YYYY-MM-DD')
确定日期<截止日期('2018-10-26','YYYY-MM-DD')+间隔时间'1'天

不相关,但是:
trunc(截止日期('2018-10-26','YYYY-MM-DD')
可以简化为
截止日期('2018-10-26','YYYY-MM-DD')
甚至
日期'2018-10-26'
我喜欢这个问题。通常提出的解决方案建议在数据库字段上使用函数,但他们忘了提到你放松了索引的使用。这就是我想要的。谢谢,@DmitryUsing
date
用于日期常量比
to\u date()
干净得多。