如何计算Case CreatedDate与Case ClosedDate之间排除周末的工作日时长
计算两个日期间排除周末的工作日时长通用方案
核心逻辑
先计算两个日期的总间隔天数,减去区间内的周末天数得到工作日天数,再结合单日工作时长换算为总时长,需要精确到小时的场景可额外叠加首尾日期的非完整工作日时长差:
工作日天数 = 总间隔天数 + 1(需包含首尾日期时加上) - 周末天数
工作日时长 = 工作日天数 * 单日标准工作时长 + 首尾非完整工作日的时长差
周末天数计算规则:
- 先算区间内的完整周数,每个完整周固定对应2天周末:
完整周周末数 = FLOOR((结束日期 - 起始日期)/7) * 2 - 再统计剩余不满一周的天数内包含的周六、周日数量,两者相加即为总周末天数
不同场景的具体实现公式
1. Excel / Google Sheets 场景
仅需统计工作日天数直接用内置函数:=NETWORKDAYS(开始日期单元格, 结束日期单元格)
需精确到小时(假设单日工作时段为9:00-18:00,共9小时):=NETWORKDAYS(开始日期, 结束日期) * 9 - MOD(开始日期,1)*24 + (18 - MOD(结束日期,1)*24)
注:结束日期落在非工作时段的情况可自行补充边界判断逻辑调整
2. SQL 场景(以MySQL为例)
计算工作日天数参考语句:
SELECT DATEDIFF(ClosedDate, CreatedDate) + 1 - (WEEK(ClosedDate) - WEEK(CreatedDate)) * 2 - (WEEKDAY(CreatedDate) = 6) - (WEEKDAY(ClosedDate) = 5) AS work_days FROM case_table;
3. 通用编程实现伪代码
# 此处默认周一周日对应值为0-6,可按所用语言的日期API规则调整周末判断条件 def calculate_work_hours(start_date, end_date, daily_work_hours=8): if start_date > end_date: return 0 total_days = (end_date - start_date).days full_weeks = total_days // 7 weekend_days = full_weeks * 2 # 统计剩余不足7天的天数内的周末数量 start_weekday = start_date.weekday() remaining_days = total_days % 7 for i in range(remaining_days + 1): current_weekday = (start_weekday + i) % 7 if current_weekday >= 5: # 周六对应5、周日对应6 weekend_days +=1 work_days = total_days + 1 - weekend_days return work_days * daily_work_hours
注:需要精确到小时的场景,可额外减去开始日期当天已过的工作时长、加上结束日期当天已过的工作时长即可
内容的提问来源于stack exchange,提问作者m.dinesh
相关产品推荐
相关产品推荐

