如何在按nmonth分组的列中仅返回过去两个月的数据
问题分析与解决办法
为啥你的过滤逻辑失效?
你现在的写法只盯着月份数字对比,完全没考虑年份,而且条件本身逻辑就不对:
- 比如现在是2024年1月,两个月前是2023年11月,
Month(Now())是1,Month(DateAdd("m",-2,Now()))是11,1≠11,这个条件永远不成立,加进去之后自然没数据。 - 用
Between的话,如果你只传月份数字,比如当前是1月,写Between Month(DateAdd("m",-2,Now())) And Month(Now())就变成Between 11 And 1,数值范围从大到小,数据库识别不出有效区间,也查不到数据。
另外你之前能拿到上个月数据,其实是运气好——如果你的数据里只有今年的上个月,哪怕漏了年份判断,也能凑巧返回结果,但这个写法本身不严谨(比如去年的同月份数据也会被拉出来)。
正确的过滤写法
分两种情况处理,看你的nmonth是什么格式:
情况1:nmonth是日期类型(比如存的是每月1号)
直接筛选日期范围,精准覆盖过去两个月:
nmonth >= DateSerial(Year(DateAdd("m", -2, Now())), Month(DateAdd("m", -2, Now())), 1) AND nmonth <= DateSerial(Year(DateAdd("m", -1, Now())), Month(DateAdd("m", -1, Now())), Day(DateSerial(Year(DateAdd("m", -1, Now())), Month(DateAdd("m", -1, Now())) + 1, 0)))
简单说就是:取两个月前当月的第一天到上个月当月的最后一天之间的所有数据。
情况2:nmonth是YYYYMM格式(比如202401代表2024年1月)
把过去两个月的年月转成相同格式,直接判断nmonth是否在这两个值里:
nmonth IN ( Year(DateAdd("m", -1, Now())) * 100 + Month(DateAdd("m", -1, Now())), Year(DateAdd("m", -2, Now())) * 100 + Month(DateAdd("m", -2, Now())) )
如果nmonth是日期类型,也可以用年份+月份拼接的方式判断:
(Year(nmonth)*100 + Month(nmonth)) IN ( Year(DateAdd("m", -1, Now())) * 100 + Month(DateAdd("m", -1, Now())), Year(DateAdd("m", -2, Now())) * 100 + Month(DateAdd("m", -2, Now())) )
内容的提问来源于stack exchange,提问作者chemman14
相关产品推荐
相关产品推荐

