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

如何使用SQL计算请假日期与报表统计日期的重叠天数

计算两个日期区间重叠天数的SQL实现方案

完全可以通过SQL实现该需求,核心逻辑是先计算两个区间的实际重叠范围,再统计天数即可。

核心计算逻辑

  • 重叠区间的开始时间取两个区间开始时间的最大值:GREATEST(leavestartdate, Reportstart)
  • 重叠区间的结束时间取两个区间结束时间的最小值:LEAST(leaveenddate, Reportend)
  • 若重叠开始时间 > 重叠结束时间,说明两个区间无重叠,重叠天数为0
  • 若存在重叠,天数计算需要包含首尾两天,所以日期差值加1即可

不同数据库实现示例

MySQL 实现

SELECT 
    CASE 
        WHEN GREATEST(leavestartdate, Reportstart) > LEAST(leaveenddate, Reportend) THEN 0
        ELSE DATEDIFF(DATE(LEAST(leaveenddate, Reportend)), DATE(GREATEST(leavestartdate, Reportstart))) + 1
    END AS overlap_days
FROM 你的业务表名;

代入你给出的示例参数,计算结果为5,完全符合预期。

PostgreSQL 实现

SELECT 
    CASE 
        WHEN GREATEST(leavestartdate, Reportstart) > LEAST(leaveenddate, Reportend) THEN 0
        ELSE (DATE(LEAST(leaveenddate, Reportend)) - DATE(GREATEST(leavestartdate, Reportstart))) + 1
    END AS overlap_days
FROM 你的业务表名;

SQL Server 实现

SELECT 
    CASE 
        WHEN GREATEST(leavestartdate, Reportstart) > LEAST(leaveenddate, Reportend) THEN 0
        ELSE DATEDIFF(DAY, CAST(GREATEST(leavestartdate, Reportstart) AS DATE), CAST(LEAST(leaveenddate, Reportend) AS DATE)) + 1
    END AS overlap_days
FROM 你的业务表名;

注意事项

  • 所有日期字段如果带时分秒,建议先转成DATE类型再计算,避免时分秒差值导致天数计算错误
  • Reportstart和Reportend作为动态参数时,直接替换SQL里的对应变量即可,不需要修改核心逻辑

内容的提问来源于stack exchange,提问作者Ankush yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:04