Oracle如何统计近7天(不含当日)每天的记录数,排除今日数据
问题原因分析
- 你添加的
eventtime < sysdate过滤条件只能排除今日当前时间之后产生的数据,今日0点到当前时间之间的数据仍然会被计入COUNT(*)的总统计结果,所以总数据还是包含当日数据 - 原有SQL中
to_char(Eventtime)=TRUNC(SYSDATE)-n的写法存在隐式类型转换,可能带来性能问题或者逻辑异常,建议统一对时间字段做TRUNC处理后再比较
正确SQL方案
核心调整点是将过滤条件改为eventtime < TRUNC(SYSDATE),直接过滤掉今日0点之后的所有数据,彻底排除当日数据,优化后的完整SQL如下:
SELECT COUNT(CASE WHEN TRUNC(Eventtime) = TRUNC(SYSDATE) - 1 THEN 1 END) AS "Day1", COUNT(CASE WHEN TRUNC(Eventtime) = TRUNC(SYSDATE) - 2 THEN 1 END) AS "Day2", COUNT(CASE WHEN TRUNC(Eventtime) = TRUNC(SYSDATE) - 3 THEN 1 END) AS "Day3", COUNT(CASE WHEN TRUNC(Eventtime) = TRUNC(SYSDATE) - 4 THEN 1 END) AS "Day4", COUNT(CASE WHEN TRUNC(Eventtime) = TRUNC(SYSDATE) - 5 THEN 1 END) AS "Day5", COUNT(CASE WHEN TRUNC(Eventtime) = TRUNC(SYSDATE) - 6 THEN 1 END) AS "Day6", COUNT(CASE WHEN TRUNC(Eventtime) = TRUNC(SYSDATE) - 7 THEN 1 END) AS "Day7", COUNT(*) AS TOTAL FROM 你的业务表名 WHERE eventtime < TRUNC(SYSDATE) -- 其他原有过滤条件可以继续追加在下方 ;
补充优化建议
- 如果Eventtime字段建有索引,为了避免TRUNC函数导致索引失效,可以将WHERE条件调整为
eventtime < TRUNC(SYSDATE) AND eventtime >= TRUNC(SYSDATE) -7,既可以命中索引,还能提前过滤掉7天之前的无效数据,大幅提升统计效率 - 调整后TOTAL统计结果就是近7天的总数据量,和Day1到Day7的数值加总结果完全一致,符合统计需求
内容的提问来源于stack exchange,提问作者houdinii
相关产品推荐
相关产品推荐

