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

求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:22:39