如何在不使用 to_date /to_char 函数的情况下比较 oracle sql 中的日期?
Posted
技术标签:
【中文标题】如何在不使用 to_date /to_char 函数的情况下比较 oracle sql 中的日期?【英文标题】:How can I compare date in oracle sql without using to_date /to_char function? 【发布时间】:2016-04-13 06:19:08 【问题描述】: select count(*) as a
from event
where eventName='ARTICLE'
and to_char(event_date,'DD-MM-YYYY')= '08-04-2016';
我想使用特定的日期格式来比较日期,但是当我运行这个查询时,它需要很多时间。有什么方法可以在最短的时间内获得相同的结果?
【问题讨论】:
你为什么在event_date
上做一个to_char
,我猜是date
,而不是在字符串上做一个to_date
?您是否试图强制将event_date
的时间部分设置为午夜?有哪些可用的索引? event_date
是否已编入索引?表上定义了哪些索引?
我猜你想要一整天。试试:select count(*) as a from event where eventName='ARTICLE' and event_date between to_date('08-04-2016','dd-mm-yyyy') and to_date('09-04-2016','dd-mm-yyyy')
请发布您的表结构(包括索引)和查询的解释计划
【参考方案1】:
您有 EVENT_DATE 的索引吗?如果你不这样做,那么你就有了一个全表扫描,而且它在不建立索引的情况下是一样快的。
如果您有索引,您的查询将不会使用它,因为to_char()
将禁用它。让我们假设您的表有足够多的不同日期,并且它们充分聚集在一起以使其值得使用索引。您可以通过多种方式更改查询以使用索引。
如果 EVENT_DATE 仅包含日期元素,请使用此
where event_date = date '2016-04-08'
如果 EVENT_DATE 包含时间元素,请使用此元素
where event_date >= date '2016-04-08'
and event_date < date '2016-04-09'
请注意,Oracle 以一种特殊的方式存储 DATE 值。它们不与任何特定掩码一起存储。格式化只是一个显示的东西。所以我们需要做的就是以有意义的格式传递目标日期。
【讨论】:
以上是关于如何在不使用 to_date /to_char 函数的情况下比较 oracle sql 中的日期?的主要内容,如果未能解决你的问题,请参考以下文章
oracle sql优化to_date和to_char 的使用