Oracle SQL获取过去12个月非周末日期的语句错误原因分析
原SQL未实现过滤效果的核心原因
- 周末过滤逻辑的作用对象完全错误
原语句的过滤条件to_char(sysdate,'DY') NOT IN ('SAT','SUN'),是对系统当前固定日期做星期值判断,而非对逐行生成的每一个CalendarDate本身校验是否为周末。这个判断的结果是恒定值:如果当天是工作日,条件永远成立,所有落在时间范围内的日期都会被保留——这也是你看到返回全量日期的直接原因;如果当天是周末,条件永远不成立,会直接返回空结果集。这个逻辑完全无法实现逐行排除周末的需求。 - 存在潜在的匹配失效问题
原语句用'SAT'/'SUN'作为星期匹配值,依赖数据库会话的日期语言为英文。如果数据库为中文环境,to_char(日期,'DY')返回的是中文星期值(如“周六”“周日”),即便修正了判断对象,这类匹配也会因为取值不对应失效。
修正后的参考实现
SELECT ADD_MONTHS(TRUNC(SYSDATE,'MM'),-12) - 1 + rownum AS CalendarDate FROM all_objects WHERE ADD_MONTHS(TRUNC(SYSDATE,'MM'),-12) - 1 + rownum <= TRUNC(sysdate) -- 对生成的每个日期本身做星期校验,强制指定语言保证星期值格式稳定 AND to_char(ADD_MONTHS(TRUNC(SYSDATE,'MM'),-12) - 1 + rownum, 'DY', 'NLS_DATE_LANGUAGE = AMERICAN') NOT IN ('SAT','SUN')
内容的提问来源于stack exchange,提问作者Steve Britton
相关产品推荐
相关产品推荐

