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
相关产品推荐
相关产品推荐

