Spotfire:计算两个日期在工作日工作时段(8-17点)的时间戳差值
计算工作日工作时段内的时间差(Spotfire)
要计算仅在工作日(排除周末)8:00-17:00时段内的小时数,不能直接用Datediff("HH", ...),需要拆分三个部分计算:开始日期当天的有效工作时长、结束日期当天的有效工作时长、中间完整工作日的总时长,再将三者相加。
核心思路
- 每天固定工作时长为9小时(17:00-8:00)
- 单独计算开始/结束日期的有效时长:
- 若开始时间早于8:00,从8:00起算;晚于17:00,当天有效时长为0
- 若结束时间晚于17:00,算到17:00;早于8:00,当天有效时长为0
- 计算开始和结束日期之间的完整工作日数(排除周末,不含开始/结束当天),乘以每天9小时
Spotfire计算列表达式
直接在Spotfire中创建计算列,使用以下表达式:
// 定义工作时段参数 Define StartWorkTime = Time("08:00:00") Define EndWorkTime = Time("17:00:00") Define DailyWorkHours = DateDiff("hh", StartWorkTime, EndWorkTime) + DateDiff("mi", StartWorkTime, EndWorkTime)/60 + DateDiff("ss", StartWorkTime, EndWorkTime)/3600 // 计算开始日有效时长 Define StartDayHours = Case When Time([Start Date]) > EndWorkTime Then 0 When Time([Start Date]) < StartWorkTime Then DailyWorkHours Else DateDiff("hh", Time([Start Date]), EndWorkTime) + DateDiff("mi", Time([Start Date]), EndWorkTime)/60 + DateDiff("ss", Time([Start Date]), EndWorkTime)/3600 End // 计算结束日有效时长 Define EndDayHours = Case When Time([End Date]) > EndWorkTime Then DailyWorkHours When Time([End Date]) < StartWorkTime Then 0 Else DateDiff("hh", StartWorkTime, Time([End Date])) + DateDiff("mi", StartWorkTime, Time([End Date]))/60 + DateDiff("ss", StartWorkTime, Time([End Date]))/3600 End // 计算中间完整工作日数量 Define StartOfMidPeriod = DateAdd("dd", 1, [Start Date]) Define EndOfMidPeriod = DateAdd("dd", -1, [End Date]) Define MidWorkDays = Case When StartOfMidPeriod > EndOfMidPeriod Then 0 Else (DateDiff("dd", StartOfMidPeriod, EndOfMidPeriod) + 1) - DateDiff("ww", StartOfMidPeriod, EndOfMidPeriod, 1) - DateDiff("ww", StartOfMidPeriod, EndOfMidPeriod, 2) End // 总有效工作时长 MidWorkDays * DailyWorkHours + StartDayHours + EndDayHours
验证你的示例
你的示例中:
- 开始日期:19/08/2022 09:42:13(周五,工作时段内)
- 结束日期:22/08/2022 09:54:22(周一,工作时段内)
- 中间日期为20、21号(周末,无有效工作日)
计算结果:
- 开始日有效时长:17:00 - 09:42:13 ≈7.296小时
- 结束日有效时长:09:54:22 - 08:00:00 ≈1.906小时
- 总时长≈7.296+1.906≈9.20小时
注:若你期望的8.13小时是手动计算误差,可检查工作时段定义或日期是否有误。
内容的提问来源于stack exchange,提问作者Spotfire_new
相关产品推荐
相关产品推荐

