如何在M查询条件语句中注入动态变量,自动计算含节假日的截止日期?
解决Power Query M语言中节假日条件判断不生效的问题
问题背景
需要通过M查询计算截止日期:取当前日期后2-5个工作日,遇节假日自动顺延1天。现有代码中尝试通过条件判断动态选择日期索引(节假日选索引5,否则选索引4),但无报错却始终执行else分支(选索引4)。
问题根源分析
- 未定义变量引用:代码中
Future9Day[Is a Holiday]是未定义的变量/表列,M语言无法识别,导致条件判断默认返回false,走else分支。 - 类型不匹配:SQL查询返回的
Holiday列值为1(节假日)或0(工作日),但代码中用字符串"TRUE"做判断,逻辑不匹配。 - 索引逻辑不清晰:直接在表索引中嵌套if判断,未明确要校验的是哪一个日期的节假日状态,逻辑执行顺序有误。
修复方案
- 基于SQL返回的
Source表数据,直接校验目标候选日期的Holiday状态。 - 先获取目标索引对应的行数据,再判断是否为节假日,决定是否顺延索引。
- 统一用数值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
相关产品推荐
相关产品推荐

