Access 2010查询:生成两日期区间内各客户应报月份列表
嘿,这个需求我熟!要把每个客户的申报起止日期拆成逐月的列表,在Access 2010里得靠一个小技巧——先整个数字辅助表,再关联查询生成结果。咱们一步步来:
步骤1:创建数字辅助表(生成连续月份的核心)
Access没有内置的序列生成工具,所以得先建一个存连续数字的表,用来覆盖你可能遇到的最长申报周期(比如存1到120,够10年的需求了):
- 新建表,命名为
tbl_Numbers,只加一个字段Number,类型选长整型。 - 往表里填数字1到你需要的最大值,嫌手动麻烦的话,用这个查询批量生成(记得先显示Access的系统表,不然用不了
MSysObjects):
INSERT INTO tbl_Numbers (Number) SELECT DISTINCT Abs([id] Mod 120) + 1 AS N FROM MSysObjects;
步骤2:写主查询生成逐月列表
接下来关联原表tbl_allocationData和数字表,生成每个客户的申报月份:
SELECT ad.客户名称, Format(DateAdd("m", [Number]-1, DateSerial(Year(ad.申报起始日期), Month(ad.申报起始日期), 1)), "yyyy年m月") AS 申报月份 FROM tbl_allocationData AS ad, tbl_Numbers AS n WHERE DateAdd("m", [Number]-1, DateSerial(Year(ad.申报起始日期), Month(ad.申报起始日期), 1)) <= ad.申报结束日期 ORDER BY ad.客户名称, 申报月份;
关键逻辑拆解
DateSerial(Year(ad.申报起始日期), Month(ad.申报起始日期), 1):把起始日期转成当月1号,避免不同天数的日期干扰(比如起始是4月15号,也能正确生成4月的起始)。DateAdd("m", [Number]-1, ...):给当月1号加上(数字-1)个月,生成连续的月份起始日(比如数字1对应起始月,数字2对应下一月,以此类推)。WHERE条件:确保生成的月份不超过申报结束日期的月份,避免多生成超出周期的月份。Format(...):把日期格式化成你要的“yyyy年m月”样式,如果想要带前导零的“2018年04月”,把格式字符串改成"yyyy年mm月"就行。
测试示例数据
如果你的tbl_allocationData里有这些数据:
| 客户名称 | 申报起始日期 | 申报结束日期 |
|---|---|---|
| 客户1 | 2018/04/01 | 2018/06/30 |
| 客户2 | 2019/01/01 | 2019/02/28 |
运行查询后就会得到你要的结果:
| 客户名称 | 申报月份 |
|---|---|
| 客户1 | 2018年4月 |
| 客户1 | 2018年5月 |
| 客户1 | 2018年6月 |
| 客户2 | 2019年1月 |
| 客户2 | 2019年2月 |
内容的提问来源于stack exchange,提问作者Matt87
相关产品推荐
相关产品推荐

