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

时间:2015-05-14 18:59:13

标签: powerpivot powerbi dax

我正在寻找一个公式来计算电力支点中两个日期之间的工作日/工作日数。

我使用以下查询在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中的类似查询。

3 个答案:

答案 0 :(得分:2)

首先,您需要创建一个日期表。这将帮助您解决此问题,并使您能够使用许多其他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语句将返回false

现在,在包含您的交易的表格中,您可以创建一个名为Number Of Weekdays的新计算列。这将

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

以下是我推荐的与此方法相关的两篇文章。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我在 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