Power BI中排除节假日和周末的工作时长计算问题
计算排除周末和节假日的工作时长(Power BI DAX修正方案)
问题背景
需要计算排除周末和节假日的有效工作时长,仅统计工作日08:00-18:00时段。Excel中可通过以下公式实现:
=(NETWORKDAYS(B2,C2,S$2:S$12)-1)*(10/24)+ IF(NETWORKDAYS(C2,C2,S$2:S$12),MEDIAN(MOD(C2,1),"18:00","08:00"),"18:00") -MEDIAN(NETWORKDAYS(B2,B2,S$2:S$12)*MOD(B2,1),"18:00","08:00")
尝试在Power BI中编写对应DAX公式时,触发报错:
Too many arguments were passed to the MEDIAN function. The maximum argument count for the function is 1.
原DAX代码:
Time = ( NETWORKDAYS('Data'[CreatedTime],'Data'[CommentTime],1,Holidays)-1)*(10/24) + IF(NETWORKDAYS('Data'[CommentTime],'Data'[CommentTime],1,Holidays), MEDIAN(MOD('Data'[CommentTime],1),"18:00","08:00"),"18:00") - MEDIAN(NETWORKDAYS('Data'[CreatedTime],'Data'[CreatedTime],1,Holidays) * MOD('Data'[CreatedTime],1),"18:00","08:00" )
示例场景:需排除2023年1月1日(周日)和1月2日(节假日),统计1月3日08:00-18:00、1月4日08:00-17:40的时长,总计19小时40分钟。
修正方案
修正后的DAX公式
Time = VAR WorkStart = 8/24 // 转换08:00为小数格式 VAR WorkEnd = 18/24 // 转换18:00为小数格式 VAR IsStartWorkday = NETWORKDAYS('Data'[CreatedTime], 'Data'[CreatedTime], 1, Holidays) VAR IsEndWorkday = NETWORKDAYS('Data'[CommentTime], 'Data'[CommentTime], 1, Holidays) VAR StartTime = MOD('Data'[CreatedTime], 1) VAR EndTime = MOD('Data'[CommentTime], 1) VAR FullWorkdays = NETWORKDAYS('Data'[CreatedTime], 'Data'[CommentTime], 1, Holidays) - 1 RETURN FullWorkdays * (10/24) + IF(IsEndWorkday, MEDIANX({WorkStart, EndTime, WorkEnd}, [Value]), 0 ) - IF(IsStartWorkday, MEDIANX({WorkStart, StartTime, WorkEnd}, [Value]), 0 )
关键修正点
- 替换MEDIAN为MEDIANX:DAX的
MEDIAN仅支持单列输入,MEDIANX可迭代临时值集合(用{}创建),实现Excel中多参数MEDIAN的效果。 - 时间格式统一:将
"08:00"、"18:00"转换为小数8/24、18/24,避免文本解析错误。 - 逻辑拆分优化:将重复计算的工作日判断、时间提取逻辑封装为变量,提升公式可读性与计算效率。
- 非工作日边界处理:若结束时间不在工作日,不增加时长;若开始时间不在工作日,不扣除时长,符合统计规则。
内容的提问来源于stack exchange,提问作者Mark Tait
相关产品推荐
相关产品推荐

