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

如何筛选出勤时间范围与指定日期范围存在重叠的员工记录

解决出勤记录与指定日期范围重叠的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:37:33