MySQL关联查询问题:如何获取完整30天月度考勤日历
解决考勤日历完整展示30天数据的问题
你的问题出在两个核心点:
- 原SQL用了默认的
INNER JOIN,只会返回两张表都有匹配记录的行,员工没打卡的日期直接被排除 WHERE attTable.EMPID = '100003'放在WHERE子句里,会把LEFT JOIN后attTable字段为NULL的行(也就是无打卡的日期)过滤掉
正确的做法是以存储完整日期的mycalendar为主表,用LEFT JOIN关联考勤表,并且把员工ID的匹配条件放到JOIN的ON子句中,而非WHERE里。
直接用下面的SQL就能得到包含6月全部30天的考勤数据:
SELECT mc.myday AS 日期, at.EMPID AS 员工ID, at.TimeIN AS 上班时间, at.TimeOUT AS 下班时间 -- 根据你的实际字段调整 FROM mycalendar mc LEFT JOIN attTable at ON DATE(at.TimeIN) = DATE(mc.myday) AND at.EMPID = '100003' -- 可选:如果mycalendar里不止6月数据,加上这个条件确保只取2022年6月 WHERE mc.myday >= '2022-06-01' AND mc.myday <= '2022-06-30' ORDER BY mc.myday;
关键说明:
LEFT JOIN以mycalendar为基础,不管员工当天有没有打卡,都会保留所有30天的日期记录- 把
at.EMPID = '100003'放到ON子句,只会匹配该员工的打卡数据,不会过滤掉无打卡的日期 - 按
mc.myday排序,保证日期按日历顺序展示
内容的提问来源于stack exchange,提问作者mafaz
相关产品推荐
相关产品推荐

