求Power Query M代码:日期列减去70个工作日(排除节假日)
Power Query M实现日期减指定工作日(含节假日排除)
核心逻辑
从原始日期开始逐日向前遍历,每遇到一个非周末且不在节假日列表中的日期,就计入工作日计数,直到计数达到70,此时的日期就是目标结果。
完整M代码(自定义列)
假设你的节假日查询名为节假日列表,日期字段为节假日日期,原始日期列名为原始日期,添加自定义列的代码如下:
= let TargetWorkdays = 70, HolidaysList = List.Buffer(节假日列表[节假日日期]), // 缓存节假日列表提升性能 CurrentDate = [原始日期], // 递归向前查找符合条件的日期 FindPreviousWorkday = (date as date, remaining as number) as date => let PreviousDate = Date.AddDays(date, -1), IsWeekend = Date.DayOfWeek(PreviousDate, Day.Monday) >= 5, // 周一为第0天,周六=5,周日=6 IsHoliday = List.Contains(HolidaysList, PreviousDate), NewRemaining = if not IsWeekend and not IsHoliday then remaining - 1 else remaining in if NewRemaining = 0 then PreviousDate else FindPreviousWorkday(PreviousDate, NewRemaining) in FindPreviousWorkday(CurrentDate, TargetWorkdays)
代码说明
List.Buffer(节假日列表[节假日日期]):将节假日列表加载到内存,避免重复查询提升效率Date.DayOfWeek(PreviousDate, Day.Monday):以周一为一周的第一天,这样周六和周日的返回值为5、6,方便判断周末- 递归函数
FindPreviousWorkday:逐日向前检查日期,每找到一个有效工作日就减少剩余计数,直到计数为0时返回当前日期
注意事项
- 确保
节假日列表中的日期都是不含周末的有效节假日,否则代码会重复排除(不影响结果,但会浪费性能) - 如果原始日期本身是周末或节假日,代码会自动从其前一天开始计数
- 若需要调整工作日数量,直接修改
TargetWorkdays = 70中的数值即可
内容的提问来源于stack exchange,提问作者H B
相关产品推荐
相关产品推荐

