如何使用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
相关产品推荐
相关产品推荐

