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

Power BI 借助 Power Query 实现含当日的最近2个工作日提取

Power Query 提取最近2个工作日(含当日若为工作日)实现方案

原代码核心问题

现有代码直接硬取本地时间往前1天到当天的连续自然日区间,没有做日期属性校验,碰到周末、非工作日时会将非工作日纳入结果集,无法满足工作日筛选要求。

改造逻辑

核心思路是从当日开始逐天往前回溯,逐天校验日期是否为工作日(默认周一至周五),凑够2个符合要求的日期就停止遍历:

  • 遍历起点设置为当天,保证“当日为工作日时自动纳入结果范围”的规则
  • 跳过所有非工作日的日期,不占用计数名额
  • 最终结果按日期升序排列,符合常规日期维度的展示习惯

调整后完整M代码

let
    // 获取本地时区下的当日零点日期值
    today = DateTime.Date(DateTimeZone.LocalNow()),
    // 定义通用回溯取工作日的函数:入参为回溯起点日期、需要收集的工作日数量
    GetWorkdays = (startDate as date, totalCount as number) as list =>
        let
            workdayList = List.Generate(
                () => [currentCheckDate = startDate, collectedWorkdays = {}],
                each List.Count([collectedWorkdays]) < totalCount,
                each [
                    // 每次遍历后往前推1天
                    nextCheckDate = Date.AddDays([currentCheckDate], -1),
                    // 判断当前检查的日期是否为周一到周五(用内置枚举避免硬编码周几序号出错)
                    isWorkday = (Day.OfWeek([currentCheckDate]) >= Day.Monday) and (Day.OfWeek([currentCheckDate]) <= Day.Friday),
                    // 是工作日就追加到收集列表,不是就保留原列表
                    collectedWorkdays = if isWorkday then [collectedWorkdays] & {[currentCheckDate]} else [collectedWorkdays],
                    currentCheckDate = nextCheckDate
                ],
                each [collectedWorkdays]
            ){0},
            // 将收集到的工作日按升序排序
            sortedWorkdayList = List.Sort(workdayList, Order.Ascending)
        in
            sortedWorkdayList,
    // 调用函数从当日开始取2个工作日
    DateList = GetWorkdays(today, 2),
    #"Converted to Table" = Table.FromList(DateList, Splitter.SplitByNothing(), null, null, ExtraValues.Ignore),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Date"}}),
    #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"Date", type date}})
in
    #"Changed Type"

效果验证说明

  • 若当日为周三(工作日):遍历首先识别周三为工作日纳入列表,再往前回溯识别周二为工作日纳入,凑够2个日期后停止,最终结果为周二、周三,符合当日纳入要求
  • 若当日为周六(非工作日):遍历识别周六非工作日直接跳过,往前识别周五为工作日纳入,再往前识别周四为工作日纳入,最终结果为周四、周五,完全排除周末日期
  • 若需要额外剔除法定节假日,仅需替换isWorkday的判断逻辑为“当前日期匹配自定义节假日表的工作日标记”即可,不需要调整整体回溯流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 23:45:04