如何在不使用 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 中的日期?的主要内容,如果未能解决你的问题,请参考以下文章

Orcale日期函数to_date(),to_char()

oracle sql优化to_date和to_char 的使用

Oracle中的日期处理函数TO_DATE 和 TO_CHAR

to_date & to_char

SQL to_char,to_date日期字符串转换问题

Oracle中的TO_DATE和TO_CHAR函数以及日期处理