计算power pivot中两个日期之间的工作日数

Calculate the number of business days between two dates in power pivot

我正在寻找一个公式来计算权力枢纽中两个日期之间 weekdays/business 天的天数。

我在 T-SQL 中使用以下查询

执行相同的操作
DATEDIFF(dd, Date1, GETDATE()) - (DATEDIFF(wk, Date1, GETDATE()) * 2) -
            CASE WHEN DATEPART(dw, Date1) = 1 THEN 1 ELSE 0 END +
            CASE WHEN DATEPART(dw, GETDATE()) = 1 THEN 1 ELSE 0 END END 

我正在 PowerPivot 中寻找类似的查询。

首先,您需要创建一个 table 日期。这将帮助您解决这个问题,并使您能够使用许多其他 Time Intelligence Functions。您可以手动创建或使用

CalendarDate | Month Key | Month Name | Quarter Name | Year
-----------------------------------------------------------
1/1/2014     | 1.00      | Jan        | Q1           | 2014
1/2/2014     | 1.00      | Jan        | Q1           | 2014
...
2/1/2014     | 2.00      | Feb        | Q1           | 2014
....
8/1/2014     | 8.00      | Aug        | Q3           | 2014
..
9/2/2014     | 9.00      | Sep        | Q3           | 2014
..
12/16/2014   | 12.00     | Dec        | Q4           | 2014

在您的 Dates Table 中可以创建一个计算列来确定每一天是否是工作日。调用列 IsWeekday

=SWITCH(WEEKDAY([CalendarDate]),7,FALSE(),1,FALSE(),TRUE())

如果星期几是一周中的第 7 天或第 1 天,SWITCH 语句将 return 为假 (Saturday/Sunday)

现在,在包含您的交易的 table 中,您可以创建一个名为“工作日数”的新计算列。这将

=CALCULATE(COUNTA(Dates[IsWeekday]),
           DATESBETWEEN(Dates[CalendarDate], 
                        TransactionTable[date1],
                        TransactionTable[date2]
                       )
          )

这里有两篇我推荐的与此方法相关的文章。

另一种解决方案是使用以下 dax 代码创建一个快速度量列:

WeekDays =
SUMX(
    SELECTCOLUMNS(
        CALENDAR(min('MyTable'[Time1]), min('MyTable'[Time2])),
        "Date", min('MyTable'[Time1]),
        "BDay", IF(WEEKDAY([Date],3) < 5, 1, 0)
    ),
    [BDay]
)

我在寻找一种在 Power BI 中计算工作日的算法时遇到了这个问题。我找到的解决方案建立在生成表的基础上(手动或自动)。他们确实工作。但就像最初的问题一样,我希望它只是算术。

所以尽管问题得到了回答,但如果其他人正在寻找与我相同的问题,下面是一个示例,说明如何在不使用日历生成的情况下进行操作。 (我确实使用这样的日历,但仅限于特定的红色日子)。

Weekdays from Dec = 
    Var DaysSinceStart = calculate(DATEDIFF(DATE(2020,12,04),max('MyTable'[Date created]),DAY)*1.0)
    Var WeeksSinceStart = DaysSinceStart/7.0
    Var LeftOverWeekDays = INT((WeeksSinceStart - int(WeeksSinceStart)) * 7.0 + 0.5)
    Var ThisWeekDay = WEEKDAY(max('MyTable'[Date created]),2)
    Var SatReductionWeekDaysLeft = if(((ThisWeekDay-LeftOverWeekDays)<0),1,0)
    Var SunReductionWeekDaysLeft = if(((ThisWeekDay-LeftOverWeekDays)<-1),1,0)
    RETURN INT(WeeksSinceStart)*5 + LeftOverWeekDays - SatReductionWeekDaysLeft - SunReductionWeekDaysLeft