MySQL查询当日休假员工的方法(含跨天休假场景)
查询当日处于休假状态的员工(含跨天休假场景)
首先得提一下你示例数据里的小细节:看起来列值有点错位了,vacation_date_end应该是日期类型(比如E1的vacation_date_end是2018-05-15),vacation_time_end是时间类型(23:59:59),我下面的查询会基于这个正确的列结构来写。
你原来的查询只筛选了vacation_date_start等于当日的记录,这只能抓到当日开始且当日结束的单日休假员工(比如E1),完全没考虑那些休假跨度包含当日的员工(E2、E3)。要同时覆盖这两种场景,我们需要判断当日是否落在员工的休假日期区间内,具体可以分两种情况处理:
1. 基础版:只按日期范围判断(忽略时间)
如果你的场景里只要日期在休假区间内就算当日休假(比如不管员工当天什么时候开始/结束,只要当天属于休假周期就统计),用这个查询就够了:
SELECT * FROM `events` WHERE `vacation_date_start` <= '2018-05-15' AND `vacation_date_end` >= '2018-05-15';
这个语句的逻辑很简单:只要员工的休假开始日期不晚于当日,且休假结束日期不早于当日,就说明当日处于休假状态。这样E1(单日)、E2(5.1-5.30)、E3(5.5-5.20)都会被查出来。
2. 进阶版:精确到时间判断
如果需要更严谨(比如员工在15号上午结束休假,下午就不算在休假里了),可以把日期和时间字段拼接成完整的datetime类型来比较:
SELECT * FROM `events` WHERE -- 休假开始时间不晚于当日结束时间 STR_TO_DATE(CONCAT(`vacation_date_start`, ' ', `vacation_time_start`), '%Y-%m-%d %H:%i:%s') <= '2018-05-15 23:59:59' -- 休假结束时间不早于当日开始时间 AND STR_TO_DATE(CONCAT(`vacation_date_end`, ' ', `vacation_time_end`), '%Y-%m-%d %H:%i:%s') >= '2018-05-15 00:00:00';
这个写法会精确判断当日的时间是否落在员工的休假时间段内,避免出现“员工当天已经结束休假但仍被统计”的情况。
两种写法都不需要修改你的表结构或数据写入方式,完全符合你不能调整写入软件的限制。
内容的提问来源于stack exchange,提问作者user4025957
相关产品推荐
相关产品推荐

