You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SQL提取近2年且不包含当月的历史数据

问题根因

原写法拆分了年、月的独立判断逻辑,两个条件是并列关系,会导致前一年度月份数大于上月月份的记录被误排除。
举个实际场景验证:当前为2023年10月时,上月是9月,你设置的月份条件为MONTH(ACCDAT_0) <9,此时2022年10-12月、2021年10-12月的记录虽然年份满足YEAR >= 2021的要求,但月份数大于9,会直接被筛掉,这就是你看到更早月份数据被误排除的原因。

修正方案

直接计算完整的时间区间边界,和日期字段直接比较即可,不需要拆分年、月判断,既避免逻辑漏洞,还能命中日期字段的索引,执行效率更高:

WHERE ACCDAT_0 >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 24, 0)
  AND ACCDAT_0 < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

逻辑说明

  • 右边界DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0):计算当前月的第一天0点,所有小于这个值的记录自动排除当月全部数据,符合你不纳入当月统计的要求。
  • 左边界DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 24, 0):计算当前月往前推24个月(即2年)的第一天0点,刚好覆盖完整2年的统计区间。

如果你的需求需要严格从上月的2年对应日期的最后一天开始统计,比如2023年10月要从2021年9月30日开始取数,可以调整左边界:

WHERE ACCDAT_0 >= DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 23, 0))
  AND ACCDAT_0 < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

内容的提问来源于stack exchange,提问作者rafa_2k1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:39:02