Oracle WHERE子句问题:报表需于2点而非零点重置计数
解决Oracle报表班次统计2点重置计数问题
原查询依赖TRUNC(SYSDATE)取自然日零点作为时间基准,导致统计范围在零点就切换,无法满足2:00重置班次计数的需求。以下是调整后的查询语句:
SELECT NVL(SUM(QUANTITY), 0) AS TOTAL FROM PP WHERE CREATEDATETIME >= CASE -- 当前时间在2:00-6:00,统计前一天16:00到当天2:00的班次数据 WHEN SYSDATE BETWEEN TRUNC(SYSDATE) + 2/24 AND TRUNC(SYSDATE) + 6/24 THEN TRUNC(SYSDATE) - 1 + 16/24 -- 当前时间在6:00-16:00,统计当天6:00到16:00的班次数据 WHEN SYSDATE BETWEEN TRUNC(SYSDATE) + 6/24 AND TRUNC(SYSDATE) + 16/24 THEN TRUNC(SYSDATE) + 6/24 -- 当前时间在16:00-次日2:00,统计当天16:00到次日2:00的班次数据 ELSE TRUNC(SYSDATE) + 16/24 END AND CREATEDATETIME < CASE WHEN SYSDATE BETWEEN TRUNC(SYSDATE) + 2/24 AND TRUNC(SYSDATE) + 6/24 THEN TRUNC(SYSDATE) + 2/24 WHEN SYSDATE BETWEEN TRUNC(SYSDATE) + 6/24 AND TRUNC(SYSDATE) + 16/24 THEN TRUNC(SYSDATE) + 16/24 ELSE TRUNC(SYSDATE) + 1 + 2/24 END
逻辑说明
- 通过
CASE语句根据当前系统时间判断所属班次,动态生成统计的起始和结束时间 - 彻底摆脱自然日零点的限制,确保只有在当天2:00之后,才会切换到6:00开始的新班次
- 覆盖所有时间区间,保证每个班次的产量统计范围完全匹配需求
内容的提问来源于stack exchange,提问作者Alan Wilcox
相关产品推荐
相关产品推荐

