我试图通过以下查询获取最近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值的日期部分?
答案 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
现在替换:
答案 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