如何使用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
相关产品推荐
相关产品推荐

