Powerbi 功率BI计算时差,不包括周末和非工作时间
我有下表,并使用此DAX公式计算首次更改日期和创建日期之间的持续时间:Powerbi 功率BI计算时差,不包括周末和非工作时间,powerbi,Powerbi,我有下表,并使用此DAX公式计算首次更改日期和创建日期之间的持续时间: Response_time = VAR Minutes = DATEDIFF('otrs ticket Response'[otrs ticket.create_time], 'otrs ticket Response'[First_Change_time],MINUTE) var days =INT(Minutes/1440) var hourNo=INT(MOD(Minutes,1440) /
Response_time =
VAR Minutes = DATEDIFF('otrs ticket Response'[otrs ticket.create_time], 'otrs ticket Response'[First_Change_time],MINUTE)
var days =INT(Minutes/1440)
var hourNo=INT(MOD(Minutes,1440) / 60)
var minuteNO=MOD(Minutes,60)
RETURN
CONCATENATE( CONCATENATE( CONCATENATE(days,"d "), CONCATENATE(hourNo, "H ")), CONCATENATE(minuteNO, "m "))
我想排除周末(我的情况是周五、周六)和非工作时间(下午5:00-上午9:00)
数据:
我将日期/时间拆分为日期和时间列。然后我使用一个日期维度,其中一列是“is
Working Day”=TRUE()
,它基于一周中的哪一天(一个简单的计算列)。在时间维度中,您同样可以识别“工时”=TRUE()
,这也是一个简单的计算
一旦尺寸设置到位,就可以很容易地构建包含/排除的计算。对于我的客户,我创建了一个逻辑。首先创建了一个
工时表
然后在具有开始和结束日期时间的表中,使用以下公式创建计算列
Working Hours Between Dates =
var startDate = [yourStartDateTime].[Date]
var startTime = [yourStartDateTime] - startDate
var endDate = [yourEndDateTime].[Date]
var endTime = [yourEndDateTime] - endDate
var firstFullDay = startDate + 1
var lastFullDay = endDate - 1
var inBetweenWorkingHours =
IF(
firstFullDay > lastFullDay,
0,
SUMX(CALENDAR(firstFullDay, lastFullDay), LOOKUPVALUE(WorkingHoursTable[WorkingHoursInAllDay], WorkingHoursTable[WeekDay], WEEKDAY([Date], 2)))
)
var firstDayStart = LOOKUPVALUE(WorkingHoursTable[StartTime], WorkingHoursTable[WeekDay], WEEKDAY(startDate, 2))
var firstDayEnd = LOOKUPVALUE(WorkingHoursTable[EndTime], WorkingHoursTable[WeekDay], WEEKDAY(startDate, 2))
var lastDayStart = LOOKUPVALUE(WorkingHoursTable[StartTime], WorkingHoursTable[WeekDay], WEEKDAY(endDate, 2))
var lastDayEnd = LOOKUPVALUE(WorkingHoursTable[EndTime], WorkingHoursTable[WeekDay], WEEKDAY(endDate, 2))
var effectiveStartTime = IF(startTime < firstDayStart, firstDayStart, startTime)
var effectiveEndTime = IF(endTime > lastDayEnd, lastDayEnd, endTime)
return
IF(
startDate = endDate,
24 * IF(effectiveEndTime > effectiveStartTime, effectiveEndTime - effectiveStartTime, 0),
var firstDayWorkingHour =
24 *
IF(
startTime > firstDayEnd,
0,
firstDayEnd - effectiveStartTime
)
var lastDayWorkingHour =
24 *
IF(
endTime < lastDayStart,
0,
effectiveEndTime - lastDayStart
)
return firstDayWorkingHour + lastDayWorkingHour + inBetweenWorkingHours
)
日期之间的工作时间=
var startDate=[yourStartDateTime].[Date]
var startTime=[yourStartDateTime]-startDate
var endDate=[yourEndDateTime].[Date]
var endTime=[yourEndDateTime]-endDate
var firstFullDay=startDate+1
var lastFullDay=endDate-1
工作时间间隔内的var=
如果(
firstFullDay>lastFullDay,
0,
SUMX(日历(firstFullDay,lastFullDay),查找值(工作小时表[WorkingHoursInAllDay],工作小时表[WeekDay],工作日([Date],2)))
)
var firstDayStart=LOOKUPVALUE(工作小时表[StartTime],工作小时表[WeekDay],工作日(startDate,2))
var firstDayEnd=LOOKUPVALUE(工作小时表[EndTime],工作小时表[WeekDay],工作日(startDate,2))
var lastDayStart=LOOKUPVALUE(工作小时表[StartTime],工作小时表[WeekDay],工作日(endDate,2))
var lastDayEnd=LOOKUPVALUE(工作小时表[EndTime],工作小时表[WeekDay],工作日(endDate,2))
var effectiveStartTime=IF(startTime工作时间表
的工作日
列
在此之后,您可以使用公式将其解析为“9d 20H 52m”。正如您所提到的,将数据/时间分为两列日期和时间是最好的方法。这段视频显示,几天来,它的工作:。。。。我只需要把它和剩下的时间和分钟结合起来。老实说,这个解决方案似乎很棒。现在,我正试图修改它以匹配我的数据并查看。但在前4个参数中“[Date]”的真正含义是什么?在
工作时间表中也是如此?我的意思是WeekDay
1的哪一天?@OmarAlSaghier对我来说,工作日1是星期一。您可以创建一个工作日为1=周日的表。只需确保正确使用工作日功能即可。它的第二个参数要求一周的开始日期。@OmarAlSaghier检查WorkingDaySimes的类型“[Total working hours]列。确保它是十进制的。@Omarasaghier在您之前的评论中,您说过您使用了WEEKDAY([Date],1)
作为WEEKDAY函数。这意味着您假设一周的第一天为周日。为了与此方法保持一致,周五和周六分别为6和7。在您的评论中指出,它们是(5,6)。对于周末,00:00-00:00对我来说很有意义。然而,我没有那个挑战,所以不是百分之百确定。