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

如何在M查询条件语句中注入动态变量,自动计算含节假日的截止日期?

解决Power Query M语言中节假日条件判断不生效的问题

问题背景

需要通过M查询计算截止日期:取当前日期后2-5个工作日,遇节假日自动顺延1天。现有代码中尝试通过条件判断动态选择日期索引(节假日选索引5,否则选索引4),但无报错却始终执行else分支(选索引4)。

问题根源分析

  1. 未定义变量引用:代码中Future9Day[Is a Holiday]是未定义的变量/表列,M语言无法识别,导致条件判断默认返回false,走else分支。
  2. 类型不匹配:SQL查询返回的Holiday列值为1(节假日)或0(工作日),但代码中用字符串"TRUE"做判断,逻辑不匹配。
  3. 索引逻辑不清晰:直接在表索引中嵌套if判断,未明确要校验的是哪一个日期的节假日状态,逻辑执行顺序有误。

修复方案

  1. 基于SQL返回的Source表数据,直接校验目标候选日期的Holiday状态。
  2. 先获取目标索引对应的行数据,再判断是否为节假日,决定是否顺延索引。
  3. 统一用数值1/0判断节假日状态,避免类型不匹配。

修复后的完整代码

// End_Date
let
    Source = Sql.Database("SERVER", "db_name", [Query="SELECT TOP 8 [date_id], 
DATENAME(WEEKDAY,[date_id]) as DoW,
(CASE WHEN [holiday]>0 THEN 1
      WHEN [dr_holiday]>0 THEN 1
      ELSE 0 END) AS Holiday, 
(weekday_id)-1 AS WkD_ID
  FROM dbo.util_dates 
    WHERE date_id >= CONVERT(DATE,GETDATE()+1)
ORDER BY date_id ASC"]),
    // 获取当前星期几(Day.Sunday为0,对应周日)
    CurrentDayOfWeek = Date.DayOfWeek(DateTime.LocalNow(), Day.Sunday),
    // 根据当前星期几确定基础索引,再判断是否需要顺延
    TargetIndex = 
        if CurrentDayOfWeek = 3 then // 周三
            let
                BaseIndex = 4,
                // 检查基础索引对应的日期是否为节假日
                IsHoliday = Source{BaseIndex}[Holiday] = 1
            in
                if IsHoliday then BaseIndex + 1 else BaseIndex
        else if CurrentDayOfWeek = 4 then // 周四
            4
        else if CurrentDayOfWeek = 5 then // 周五
            parGetEndDate // 假设parGetEndDate是已定义的参数
        else // 其他日期(周日-周二)
            2,
    // 根据最终索引获取截止日期
    date_id = Date.From(Source{TargetIndex}[date_id])
in
    date_id

关键修改说明

  • 新增CurrentDayOfWeek变量,简化重复的星期判断逻辑。
  • 针对周三的场景,先获取基础索引(4)对应的行,直接读取Source表中的Holiday值判断是否为节假日,动态调整索引。
  • 移除无意义的Add_Date_Picker_col列(原代码中该列值固定为Source{2}[date_id],未实际使用)。
  • 用数值1判断节假日状态,与SQL返回的Holiday列类型匹配。

内容的提问来源于stack exchange,提问作者Terry Mabry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:12:24