MySQL中使用DATEDIFF统计指定时段内员工任务天数(含跨年场景)
统计任务在指定时间范围内的实际天数
你的schedule表存储员工任务记录,原查询在处理跨年度/跨季度的任务时,会把任务全部时长计入指定年度,无法准确统计任务落在目标时间范围内的天数。要解决这个问题,需要计算任务时间与目标区间的重叠天数,而非任务的总时长。
修改后的查询语句(以2023年度为例)
SELECT taskname, employee, startDate, endDate, SUM( DATEDIFF( LEAST(endDate, '2023-12-31'), GREATEST(startDate, '2023-01-01') ) + 1 ) AS total_days FROM schedule WHERE startDate <= '2023-12-31' AND endDate >= '2023-01-01' GROUP BY employee, taskname
关键逻辑说明
GREATEST(startDate, '2023-01-01'):取任务开始日期和年度起始日期的较大值,确保只从年度开始后计算天数LEAST(endDate, '2023-12-31'):取任务结束日期和年度结束日期的较小值,确保只计算到年度结束的天数DATEDIFF(...) + 1:计算两个日期之间的天数(包含首尾日期)- 保留原WHERE子句:过滤掉完全不在2023年度的任务,避免无效计算
如果要统计季度(比如2023年Q1),只需把日期参数换成'2023-01-01'和'2023-03-31'即可,逻辑完全通用。
内容的提问来源于stack exchange,提问作者Laurens Swart
相关产品推荐
相关产品推荐

