如何筛选出勤时间范围与指定日期范围存在重叠的员工记录
解决出勤记录与指定日期范围重叠的SQL查询问题
嘿,这个需求其实是时间范围重叠查询的经典场景,我来帮你理清楚怎么实现~
首先我们得明确:什么时候两个时间范围会有重叠? 反过来想会更简单——两个范围完全不重叠的情况只有两种:
- 出勤记录的结束日期,早于你要查询的日期范围的开始日期
- 出勤记录的开始日期,晚于你要查询的日期范围的结束日期
所以只要排除掉这两种完全不重叠的情况,剩下的就是所有和指定范围有至少一天重叠的记录了。
方案一:反向排除法(逻辑清晰,容易理解)
SELECT * FROM presences WHERE NOT ( end_date < '2022-04-04' -- 出勤结束在查询范围开始前 OR start_date > '2022-04-06' -- 出勤开始在查询范围结束后 );
方案二:正向匹配法(等价逻辑,直接判断交集)
也可以直接写出存在交集的条件,逻辑是:出勤的开始日期不晚于查询范围的结束,且出勤的结束日期不早于查询范围的开始。这样能覆盖所有重叠场景:
SELECT * FROM presences WHERE start_date <= '2022-04-06' AND end_date >= '2022-04-04';
验证你提到的示例
- 对于全年出勤的记录(
start='2022-01-01',end='2022-12-31'):start_date <= '2022-04-06'和end_date >= '2022-04-04'都成立,会被返回 - 对于仅在2022-04-05出勤的记录:
start_date='2022-04-05' <= '2022-04-06',且end_date='2022-04-05' >= '2022-04-04',同样满足条件会被返回
这两种写法效果完全一致,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者PeterPan
相关产品推荐
相关产品推荐

