SQL Server中如何根据tbl_leave更新tbl_Attendance的Marked字段为2
解决方案:更新考勤表中请假员工的记录
没问题,我来帮你搞定这个需求!我们需要通过关联两张表,识别出考勤日期落在请假时间段内的员工,然后更新他们的Marked字段值为2。下面分不同数据库场景给出具体的SQL语句:
1. MySQL 版本
UPDATE tbl_Attendance a JOIN tbl_leave l ON a.empcode = l.empcode SET a.Marked = 2 WHERE STR_TO_DATE(a.datetime_, '%d-%m-%Y') BETWEEN STR_TO_DATE(l.datetime_From, '%d-%m-%Y') AND STR_TO_DATE(l.datetime_To, '%d-%m-%Y');
说明:
- 用
JOIN关联两张表的empcode(员工编码),确保我们处理的是同一个员工的记录 STR_TO_DATE函数把字符串格式的日期(dd-mm-yyyy)转换成MySQL可识别的日期类型,这样才能正确比较时间段BETWEEN关键字用来判断考勤日期是否在请假的起止日期范围内,符合条件的记录会被更新Marked为2
2. SQL Server 版本
UPDATE a SET a.Marked = 2 FROM tbl_Attendance a INNER JOIN tbl_leave l ON a.empcode = l.empcode WHERE CONVERT(DATE, a.datetime_, 105) BETWEEN CONVERT(DATE, l.datetime_From, 105) AND CONVERT(DATE, l.datetime_To, 105);
说明:
- SQL Server用
CONVERT函数转换日期格式,105对应dd-mm-yyyy的格式代码 - 逻辑和MySQL版本一致,通过关联员工编码,判断日期范围后更新字段
3. 更高效的 EXISTS 写法(通用多数数据库)
如果你的表数据量较大,或者担心同一个员工同一天有多个请假记录导致重复更新,可以用EXISTS子查询的方式,性能更优:
UPDATE tbl_Attendance a SET a.Marked = 2 WHERE EXISTS ( SELECT 1 FROM tbl_leave l WHERE a.empcode = l.empcode AND STR_TO_DATE(a.datetime_, '%d-%m-%Y') BETWEEN STR_TO_DATE(l.datetime_From, '%d-%m-%Y') AND STR_TO_DATE(l.datetime_To, '%d-%m-%Y') );
(SQL Server版本只需把STR_TO_DATE替换成CONVERT(DATE, xxx, 105)即可)
验证结果
执行上述语句后,你的tbl_Attendance表会和预期一致:
- emp1和emp2的考勤日期落在请假时间段内,
Marked被更新为2 - emp3到emp5没有对应请假记录,
Marked保持1
内容的提问来源于stack exchange,提问作者Nityanand Vishwakarma
相关产品推荐
相关产品推荐

