如何在Access中基于日期查询当前月及上月的记录
嘿,这个Access查询的需求我熟!要抓取当前月及上个月的ReleaseDate记录,还得处理1月时上月属于上一年的情况,用Access自带的日期函数就能轻松搞定,我给你详细说说:
你只需要在查询设计视图中,给ReleaseDate字段的条件行输入以下表达式就行:
Between DateSerial(Year(Date()), Month(Date())-1, 1) And DateSerial(Year(Date()), Month(Date())+1, 0)
为啥这个表达式能搞定跨年问题?我拆解开给你看:
上个月的第一天:
DateSerial(Year(Date()), Month(Date())-1, 1)
用Date()拿到当前日期,Year(Date())取年份,Month(Date())-1取上月月份。如果当前是1月,Month(Date())-1会得到0,这时候DateSerial会自动把年份减1,月份替换成12,直接生成上一年的12月1日,完美解决跨年场景。当前月的最后一天:
DateSerial(Year(Date()), Month(Date())+1, 0)
这是个实用小技巧:DateSerial函数如果接收的“日”参数是0,会返回传入月份的前一个月的最后一天。所以传入当前月份+1、日为0,就得到了当前月的最后一天——比如5月的话,传入6月0日就是5月31日,1月的话传入2月0日就是1月31日。
另一种等价写法(用DateAdd)
如果你习惯用DateAdd函数,也可以这么写条件:
ReleaseDate >= DateAdd("m", -1, DateSerial(Year(Date()), Month(Date()), 1)) And ReleaseDate <= DateSerial(Year(Date()), Month(Date())+1, 0)
这里DateAdd("m", -1, ...)是把当前月的第一天往前推一个月,效果和直接生成上月第一天完全一样。
小测试建议
怕出错的话,你可以打开Access的立即窗口(按Ctrl+G就能调出来),输入这些表达式验证结果:
- 输入
? DateSerial(Year(Date()), Month(Date())-1, 1),回车看是不是上个月第一天 - 输入
? DateSerial(Year(Date()), Month(Date())+1, 0),确认是不是当前月最后一天
这样设置完条件,查询就会精准返回所有ReleaseDate在上个月1日到当前月最后一天之间的记录啦!
内容的提问来源于stack exchange,提问作者Thomas Heikkila

