2

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

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

4

3 回答 3

2

首先,您需要创建一个日期表。这将帮助您解决此问题,并使您能够使用许多其他时间智能功能。您可以手动创建或使用

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

在您的日期表中可以创建一个计算列来确定每一天是否是工作日。调用列 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]
                       )
          )

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

于 2015-05-18T19:49:57.363 回答
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]
)
于 2018-12-18T18:31:21.607 回答
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
于 2021-02-20T08:37:39.130 回答