Access查询:匹配每日输入日期的年月与月度生产目标
按年月匹配Access两张表的查询方案
嘿,这个需求在日常数据库操作里挺常见的——咱们只需要把两张表的日期都提取出年月部分来做关联条件,就能让每日录入的数据匹配到对应月份的生产目标了。下面给你几种实用的SQL写法,你可以根据自己表的实际情况选:
方法1:用Format函数统一年月格式(直观易懂)
如果你的两张表日期字段都是日期/时间类型,直接用Format()把日期转成「年-月」的字符串,就能精准匹配同一月份的记录:
SELECT d.*, t.* FROM tbl_DailyInput AS d INNER JOIN tbl_ProductionTarget AS t ON Format(d.DailyDate, "yyyy-mm") = Format(t.TargetDate, "yyyy-mm");
注:这里假设tbl_DailyInput的日期字段叫DailyDate,tbl_ProductionTarget的日期字段叫TargetDate,你可以换成自己表的实际字段名
方法2:用Year+Month组合成数字(性能更优)
如果数据量比较大,用数字形式的年月匹配会比字符串更高效。咱们把年份乘100加月份,比如2024年5月就是202405,这样两个表的年月数字相等就代表是同一月份:
SELECT d.*, t.* FROM tbl_DailyInput AS d INNER JOIN tbl_ProductionTarget AS t ON (Year(d.DailyDate) * 100 + Month(d.DailyDate)) = (Year(t.TargetDate) * 100 + Month(t.TargetDate));
特殊场景:目标表存的是每月第一天
如果你的tbl_ProductionTarget里的日期字段固定是每月1号(比如2024-05-01),那可以直接生成每日日期对应的当月第一天来匹配,写法更简洁:
SELECT d.*, t.* FROM tbl_DailyInput AS d INNER JOIN tbl_ProductionTarget AS t ON DateSerial(Year(d.DailyDate), Month(d.DailyDate), 1) = t.TargetDate;
小提醒
- 确保两张表的日期字段都是日期/时间类型,如果是文本格式,记得先用
CDate()函数转换,比如CDate(d.DailyDate) - 如果想保留所有每日录入数据(哪怕没有对应月份的目标),把
INNER JOIN换成LEFT JOIN就行
内容的提问来源于stack exchange,提问作者Flammie
相关产品推荐
相关产品推荐

