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

PowerBI DAX日期表生成异常:无法稳定输出指定5个工作日

解决PowerBI DAX创建指定工作日日期表的问题

原代码通过固定日期范围+排除特定日期的方式,无法灵活适配不同工作日的需求(比如周一需要往前取到上周的周四、周五,超出了原代码的CurrentDate-4范围),导致结果不符合预期。

预期输出规则

  • 今日为周一:上周四、上周五、今日周一、下周二、下周三
  • 今日为周二:上周五、上周一、今日周二、下周三、下周四
  • 今日为周三:上周一、上周二、今日周三、下周四、下周五
  • 今日为周四:上周二、上周三、今日周四、下周五、下周一
  • 今日为周五:上周三、上周四、今日周五、下周一、下周二

原错误代码

5 dagen = 
VAR CurrentDate = TODAY()
VAR CustomCalendar =
    ADDCOLUMNS (
        FILTER (
            CALENDAR ( CurrentDate - 4, CurrentDate + 4 ),
            WEEKDAY ( [Date], 2 ) >= 1 && WEEKDAY ( [Date], 2 ) <= 5
            && [Date] <> CurrentDate - 3
            && [Date] <> CurrentDate + 3
        ),
        "DayOfWeek", WEEKDAY ( [Date], 2 ),
        "FormattedDateDutch",
        VAR EngDay = FORMAT ( [Date], "ddd" )
        VAR DayOfMonth = DAY ( [Date] )
        VAR MonthOfYear = MONTH ( [Date] )
        RETURN
            SWITCH (
                TRUE (),
                EngDay = "Mon", "Ma",
                EngDay = "Tue", "Di",
                EngDay = "Wed", "Wo",
                EngDay = "Thu", "Do",
                EngDay = "Fri", "Vr",
                EngDay = "Sat", "Za",
                "Zo"
            ) & " " & FORMAT ( DayOfMonth, "00" ) & "-" & FORMAT ( MonthOfYear, "00" )
    )
RETURN
    CustomCalendar

错误输出示例

Date
12-10-2023 00:00:00
16-10-2023 00:00:00
17-10-2023 00:00:00
18-10-2023 00:00:00
20-10-2023 00:00:00

修正后的DAX代码

5 dagen = 
VAR CurrentDate = TODAY()
// 生成前2个工作日的日期列表
VAR PreviousWorkdays = 
    TOPN(
        2,
        FILTER(
            CALENDAR(CurrentDate - 10, CurrentDate - 1), // 扩大范围确保能取到足够的工作日
            WEEKDAY([Date],2) IN {1,2,3,4,5}
        ),
        [Date], DESC
    )
// 生成后2个工作日的日期列表
VAR NextWorkdays = 
    TOPN(
        2,
        FILTER(
            CALENDAR(CurrentDate + 1, CurrentDate + 10), // 扩大范围确保能取到足够的工作日
            WEEKDAY([Date],2) IN {1,2,3,4,5}
        ),
        [Date], ASC
    )
// 合并所有日期并添加格式列
VAR CombinedDates = 
    UNION(
        PreviousWorkdays,
        ROW("Date", CurrentDate),
        NextWorkdays
    )
RETURN
    ADDCOLUMNS(
        CombinedDates,
        "DayOfWeek", WEEKDAY([Date],2),
        "FormattedDateDutch",
            VAR EngDay = FORMAT([Date], "ddd")
            RETURN
                SWITCH(
                    EngDay,
                    "Mon", "Ma",
                    "Tue", "Di",
                    "Wed", "Wo",
                    "Thu", "Do",
                    "Fri", "Vr",
                    "Sat", "Za",
                    "Zo"
                ) & " " & FORMAT(DAY([Date]), "00") & "-" & FORMAT(MONTH([Date]), "00")
    )

代码说明

  1. 灵活获取前后工作日:使用TOPN配合扩大的日期范围,精准筛选出当前日期之前的2个最近工作日和之后的2个最近工作日,避免固定日期范围的局限性。
  2. 合并日期:通过UNION将前2个工作日、当前日、后2个工作日合并成完整的5天列表。
  3. 保留原有格式逻辑:保留了荷兰语日期格式的转换逻辑,确保输出格式符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:43:34