如何基于datesbetween计算两日期间排除周末的精确小时数?
计算排除周末的精确工作小时数(24/5工作制)
前提准备
确保你的日历表(Calendar)已添加IsWorkday列,用于标记工作日(排除周六、周日),DAX公式如下:
IsWorkday = NOT(WEEKDAY('Calendar'[Date], 2) IN {6,7})
(说明:WEEKDAY第2参数设为2时,周一为1、周六为6、周日为7,因此排除6和7即为工作日)
计算列DAX公式
在你的数据表里新建计算列,命名为工作小时数,输入以下DAX代码(替换'表名'为你的实际表名称):
工作小时数 = VAR OpenedDT = '表名'[创建日期] VAR ClosedDT = '表名'[关闭日期] VAR OpenedDate = DATE(YEAR(OpenedDT), MONTH(OpenedDT), DAY(OpenedDT)) VAR ClosedDate = DATE(YEAR(ClosedDT), MONTH(ClosedDT), DAY(ClosedDT)) VAR OpenedIsWorkday = CALCULATE(MAX('Calendar'[IsWorkday]), 'Calendar'[Date] = OpenedDate) VAR ClosedIsWorkday = CALCULATE(MAX('Calendar'[IsWorkday]), 'Calendar'[Date] = ClosedDate) VAR SameDayHours = IF(OpenedDate = ClosedDate, IF(OpenedIsWorkday, DATEDIFF(OpenedDT, ClosedDT, SECOND)/3600, 0), 0 ) VAR StartDayHours = IF(OpenedDate <> ClosedDate && OpenedIsWorkday, DATEDIFF(OpenedDT, OpenedDate + 1, SECOND)/3600, 0 ) VAR EndDayHours = IF(OpenedDate <> ClosedDate && ClosedIsWorkday, DATEDIFF(ClosedDate, ClosedDT, SECOND)/3600, 0 ) VAR FullWorkdaysHours = IF(OpenedDate <> ClosedDate, CALCULATE( COUNTROWS('Calendar'), 'Calendar'[Date] > OpenedDate, 'Calendar'[Date] < ClosedDate, 'Calendar'[IsWorkday] = TRUE() ) * 24, 0 ) RETURN SameDayHours + StartDayHours + EndDayHours + FullWorkdaysHours
公式说明
- 时间拆分:将完整时间戳拆分为日期部分和时间部分,分别处理起始日、结束日的剩余/已用小时,以及中间完整工作日的小时数
- 特殊场景处理:
- 若起始日和结束日为同一天,仅当天是工作日时计算时间差
- 起始日/结束日为周末时,对应时间段的小时数直接记为0
- 精确计算:通过
DATEDIFF计算秒数差再转换为小时,保证精度
示例验证
针对你提供的示例数据:
- 第一行:创建日期为周六(非工作日),关闭日期为周二(工作日),计算结果约为36.515小时(1个完整工作日24小时 + 结束日12小时30分55秒)
- 第二行:创建日期为周五(工作日),关闭日期为周四(工作日),计算结果约为86小时(起始日剩余22小时29分4秒 + 2个完整工作日48小时 + 结束日15小时30分55秒)
内容的提问来源于stack exchange,提问作者Deepak D
相关产品推荐
相关产品推荐

