Power BI - Adding/Subtracting 使用 DAX 的工作时间
Power BI - Adding/Subtracting to the Working Hours using DAX
我有两个table。
日历Table
Date Holiday
1/1/2019 Yes
1/2/2019 No
1/3/2019 No
1/4/2019 Yes
1/5/2019 No
1/6/2019 Yes
1/7/2019 No
.
.
数据Table
Request # CreatedDateTime ClosedDateTime
A1 1/2/2019 7:15:00 AM 1/4/2019 7:15:00 AM
A2 1/2/2019 5:15:00 AM 1/5/2019 7:15:00 AM
A3 1/1/2019 7:45:00 AM 1/6/2019 7:15:00 AM
工作时间是早上 7 点到下午 6 点
如果在非工作时间创建了请求,则工单将移至下一个可用的工作时间。日历 table 给出了工作日和非工作日。
CreatedDateTime_Updated 给出了预期的结果。
Request # CreatedDateTime CreatedDateTime_Updated
A1 1/2/2019 7:15:00 AM 1/2/2019 7:15:00 AM
A2 1/2/2019 5:15:00 AM 1/2/2019 7:00:00 AM
A3 1/1/2019 7:45:00 AM 1/2/2019 7:00:00 AM
现在,我尝试将 33 个工作时间添加到此列 CreatedDateTime_Updated 并将其称为 DueDateTime
Request # CreatedDateTime_Updated DueDateTime
A1 1/2/2019 7:15:00 AM 1/7/2019 7:15:00 AM
A2 1/2/2019 7:00:00 AM 1/5/2019 6:00:00 PM
A3 1/2/2019 7:00:00 AM 1/5/2019 6:00:00 PM
与CreateDateTime列转换类似,ClosedDateTime也需要转换。但是,到之前的工作时间,如果在非工作时间关闭。
Request # ClosedDateTime ClosedDateTime_Updated
A1 1/4/2019 7:15:00 AM 1/3/2019 6:00:00 PM
A2 1/5/2019 7:15:00 AM 1/5/2019 7:15:00 AM
A3 1/6/2019 7:15:00 AM 1/5/2019 6:00:00 AM
请按单步说明,以便需要时调整公式。
谢谢。
首先,在您的日历上创建几个计算列 table:
WorkHours = IF('Calendar'[Holiday] = "Yes", 0, 11)
和
CumulativeHours =
CALCULATE(
SUM('Calendar'[WorkHours]),
ALL('Calendar'),
'Calendar'[Date] <= EARLIER('Calendar'[Date])
)
我使用了计算列CreatedDateTime_Updated
CreatedDateTime_Updated =
VAR NextWorkDay =
CALCULATE (
MIN ( 'Calendar'[Date] ),
FILTER ( 'Calendar', 'Calendar'[Date] >= Data[CreatedDateTime].[Date] ),
'Calendar'[Holiday] = "No"
)
RETURN
IF (
HOUR ( Data[CreatedDateTime] ) < 7
|| NextWorkDay > Data[CreatedDateTime].[Date],
NextWorkDay + TIME ( 7, 0, 0 ),
Data[CreatedDateTime]
)
创建一个 DueDateTime
列:
DueDateTime =
VAR CurrentCumulative =
LOOKUPVALUE (
'Calendar'[CumulativeHours],
'Calendar'[Date], Data[CreatedDateTime_Updated].[Date] - 1
)
VAR HoursIntoDay =
ROUND (
24 * ( Data[CreatedDateTime_Updated] - Data[CreatedDateTime_Updated].[Date] )
- 7,
2
)
VAR DueDate =
CALCULATE (
MIN ( 'Calendar'[Date] ),
FILTER (
'Calendar',
'Calendar'[CumulativeHours] >= CurrentCumulative + HoursIntoDay + 33
)
)
RETURN
IF ( HoursIntoDay > 0, DueDate + ( 7 + HoursIntoDay ) / 24, DueDate + 18 / 24 )
有时间我会尽量详细说明
我有两个table。
日历Table
Date Holiday
1/1/2019 Yes
1/2/2019 No
1/3/2019 No
1/4/2019 Yes
1/5/2019 No
1/6/2019 Yes
1/7/2019 No
.
.
数据Table
Request # CreatedDateTime ClosedDateTime
A1 1/2/2019 7:15:00 AM 1/4/2019 7:15:00 AM
A2 1/2/2019 5:15:00 AM 1/5/2019 7:15:00 AM
A3 1/1/2019 7:45:00 AM 1/6/2019 7:15:00 AM
工作时间是早上 7 点到下午 6 点
如果在非工作时间创建了请求,则工单将移至下一个可用的工作时间。日历 table 给出了工作日和非工作日。
CreatedDateTime_Updated 给出了预期的结果。
Request # CreatedDateTime CreatedDateTime_Updated
A1 1/2/2019 7:15:00 AM 1/2/2019 7:15:00 AM
A2 1/2/2019 5:15:00 AM 1/2/2019 7:00:00 AM
A3 1/1/2019 7:45:00 AM 1/2/2019 7:00:00 AM
现在,我尝试将 33 个工作时间添加到此列 CreatedDateTime_Updated 并将其称为 DueDateTime
Request # CreatedDateTime_Updated DueDateTime
A1 1/2/2019 7:15:00 AM 1/7/2019 7:15:00 AM
A2 1/2/2019 7:00:00 AM 1/5/2019 6:00:00 PM
A3 1/2/2019 7:00:00 AM 1/5/2019 6:00:00 PM
与CreateDateTime列转换类似,ClosedDateTime也需要转换。但是,到之前的工作时间,如果在非工作时间关闭。
Request # ClosedDateTime ClosedDateTime_Updated
A1 1/4/2019 7:15:00 AM 1/3/2019 6:00:00 PM
A2 1/5/2019 7:15:00 AM 1/5/2019 7:15:00 AM
A3 1/6/2019 7:15:00 AM 1/5/2019 6:00:00 AM
请按单步说明,以便需要时调整公式。
谢谢。
首先,在您的日历上创建几个计算列 table:
WorkHours = IF('Calendar'[Holiday] = "Yes", 0, 11)
和
CumulativeHours =
CALCULATE(
SUM('Calendar'[WorkHours]),
ALL('Calendar'),
'Calendar'[Date] <= EARLIER('Calendar'[Date])
)
我使用了计算列CreatedDateTime_Updated
CreatedDateTime_Updated =
VAR NextWorkDay =
CALCULATE (
MIN ( 'Calendar'[Date] ),
FILTER ( 'Calendar', 'Calendar'[Date] >= Data[CreatedDateTime].[Date] ),
'Calendar'[Holiday] = "No"
)
RETURN
IF (
HOUR ( Data[CreatedDateTime] ) < 7
|| NextWorkDay > Data[CreatedDateTime].[Date],
NextWorkDay + TIME ( 7, 0, 0 ),
Data[CreatedDateTime]
)
创建一个 DueDateTime
列:
DueDateTime =
VAR CurrentCumulative =
LOOKUPVALUE (
'Calendar'[CumulativeHours],
'Calendar'[Date], Data[CreatedDateTime_Updated].[Date] - 1
)
VAR HoursIntoDay =
ROUND (
24 * ( Data[CreatedDateTime_Updated] - Data[CreatedDateTime_Updated].[Date] )
- 7,
2
)
VAR DueDate =
CALCULATE (
MIN ( 'Calendar'[Date] ),
FILTER (
'Calendar',
'Calendar'[CumulativeHours] >= CurrentCumulative + HoursIntoDay + 33
)
)
RETURN
IF ( HoursIntoDay > 0, DueDate + ( 7 + HoursIntoDay ) / 24, DueDate + 18 / 24 )
有时间我会尽量详细说明