Oracle SQL查询如何排除周末,实现工作日的前一日拣选交易统计?
解决Oracle SQL中忽略周末取前一个工作日数据的问题
直接修改查询中的日期判断逻辑,自动识别周一并返回上周五的数据,其他工作日返回前一天的数据,修改后的语句如下:
SELECT EMPLOYEE_ID, MIN(END_TRAN_TIME), MAX(END_TRAN_TIME), COUNT(TRAN_TYPE) FROM T_TRAN_LOG WHERE WH_ID ='W376' AND TRUNC(END_TRAN_DATE) = CASE -- 强制用英文判断周一,避免不同地区日期语言设置的影响 WHEN TO_CHAR(TRUNC(sysdate), 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'MONDAY' THEN TRUNC(sysdate) - 3 ELSE TRUNC(sysdate) - 1 END AND TRAN_TYPE IN ('301', '303', '305') GROUP BY EMPLOYEE_ID;
关键修改说明
- 替换了原语句中固定的
TRUNC(sysdate-1),通过CASE分支处理周一的特殊情况:周一运行时自动往前推3天到上周五,其他工作日则保持推1天 - 使用
NLS_DATE_LANGUAGE=ENGLISH参数确保周几的判断不受数据库语言设置影响,避免出现不同地区周一标识不同的问题 - 保留原有的拣选交易类型过滤、仓库ID过滤及统计逻辑,确保查询的核心功能不变
如果后续需要兼容法定节假日,可在此基础上关联公司内部的节假日表,进一步调整日期计算逻辑。
内容的提问来源于stack exchange,提问作者Nick.Lamarche
相关产品推荐
相关产品推荐

