You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
)

关键修正点

  1. 替换MEDIAN为MEDIANX:DAX的MEDIAN仅支持单列输入,MEDIANX可迭代临时值集合(用{}创建),实现Excel中多参数MEDIAN的效果。
  2. 时间格式统一:将"08:00"、"18:00"转换为小数8/24、18/24,避免文本解析错误。
  3. 逻辑拆分优化:将重复计算的工作日判断、时间提取逻辑封装为变量,提升公式可读性与计算效率。
  4. 非工作日边界处理:若结束时间不在工作日,不增加时长;若开始时间不在工作日,不扣除时长,符合统计规则。

内容的提问来源于stack exchange,提问作者Mark Tait

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:50:23