如何仅根据Oracle中的日期部分比较两个DATE值?

时间:2011-09-15 15:25:23

标签: sql oracle date compare datepart

我试图通过以下查询获取最近30天的计数 -

SELECT date_occured, COUNT(*) FROM problem
WHERE date_occured >= (CURRENT_DATE - 30)
GROUP BY date_occured;

//date_occured field is of type DATE.

基本上,在我的查询中,我只想比较条件date_occured >= (CURRENT_DATE - 30)中的日期部分,但似乎也比较时间。

我按照以下方式尝试了TRUNC -

TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30)

但是当运行查询时它永远不会返回。

我也试过了 -

SELECT date_occured, COUNT(*) FROM problem    
GROUP BY date_occured
HAVING TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30);

再次它永远不会回来。

如何仅比较Oracle中两个DATE值的日期部分?

5 个答案:

答案 0 :(得分:15)

对于这种情况,您只需要TRUNC右侧:

WHERE date_occured >= TRUNC(CURRENT_DATE - 30)

为什么呢?因为如果TRUNC(date_occured)晚于TRUNC(CURRENT_DATE - 30),那么TRUNC(date_occured)之后的任何时刻也必然晚于TRUNC(CURRENT_DATE - 30)。

date_occured> = TRUNC(date_occured)显然总是如此(考虑一下)。

逻辑说如果A> = B且B> = C则遵循A> = C

现在替换:

  • A:date_occured
  • B:TRUNC(date_occured)
  • C:TRUNC(CURRENT_DATE - 30)

答案 1 :(得分:3)

我想你也想在选择部分中截断:

 SELECT TRUNC(date_occured) AS short_date_occured, COUNT(*)
 FROM problem 
 WHERE date_occured >= trunc(SYSDATE- 30) 
 GROUP BY short_date_occured;

答案 2 :(得分:1)

尝试使用SYSDATE与CURRENT_DATE。 Sysdate使用服务器的本地时间,其中CURRENT_DATE在客户端连接的本地时间返回服务器的当前日期/时间。

答案 3 :(得分:1)

我倾向于怀疑托尼是正确的,你真的只想TRUNC表达的右侧。

如果您确实想要TRUNC表达式的两边并且遇到性能问题,则可能需要基于函数的索引

CREATE INDEX idx_problem_trunc_dt_occured
    ON problem( trunc( date_occurred ) );

这将允许您的原始查询使用基于函数的索引。

答案 4 :(得分:0)

这是索引友好的方法。

如果使用Oracle的Native MONTHS_BETWEEN函数,则无需在列上使用函数。

它返回月数差异。天数也有所不同,但在精度方面,这就是为什么我更喜欢使用BETWEEN子句

WHERE MONTHS_BETWEEN(date_occured, CURRENT_DATE - 30) BETWEEN 0 AND 1