为了从索引中获益,是否有办法避免在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'
我喜欢这个问题。通常提出的解决方案建议在数据库字段上使用函数,但他们忘了提到你放松了索引的使用。这就是我想要的。谢谢,@DmitryUsingdate
用于日期常量比to\u date()
干净得多。