You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:11:12