计算两个日期之间的营业时间,不包括 Tableau 中的周末

Calculate business hours between two dates, excluding weekends in Tableau

在 Tableau 中,如何计算两个日期之间的营业额 hours/mins,不包括周末?

例如,我的工作时间是周一至周五上午 9 点至下午 6 点。您想计算 05/10/2018 上午 10 点和 05/14/2018 上午 11 点之间的处理时间,因为您的团队只计算工作时间。答案是 19 小时,但如何在 Tableau 中做到这一点?

这是一个非常常见的问题,一直被问到,但实际上并没有完整的答案。以下是我的解决方案。

1.Call 它[周末计数]。找出这两个时间之间有多少个周末

int( (DATEDIFF('day',[Start],[End])+DATEPART('weekday',[Start])) /7 )
*2
+ (if DATEPART('weekday',[Start]) = 1 then 1 else 0 end)
- (if DATEPART('weekday',[End]) = 7 then 1 else 0 end)

2.Call它[Start hour],计算您的[Start]小时与您的营业时间的时差(将18(6pm)替换为您的营业时间,并替换9(您的营业时间持续时间) 和你的电话号码)。 (我在这里的时间是上午 9 点到下午 6 点)

IF
18 - DATEPART('hour',[Start]) >0 and 18 - DATEPART('hour',[Start]) <=9
and DATEPART('minute',[Start]) > 0
then 18 - DATEPART('hour',[Start]) - 1

elseif 18 - DATEPART('hour',[Start]) >0
and DATEPART('minute',[Start]) = 0
then 18 - DATEPART('hour',[Start])

elseif 18 - DATEPART('hour',[Start]) <= 0 then 0

elseif 18 - DATEPART('hour',[Start]) >9
then 9
END

3.Call [Start Min],与 #2 相同的逻辑,将 18 替换为您的结束时间

if [Start Hour] > 0
and DATEPART('minute',[Start]) != 0
then 60 - DATEPART('minute',[Start])

elseif [Start Hour] = 0 and
DATEPART('hour',[Start]) < 18
then 60 - DATEPART('minute',[Start])

elseif [Start Hour] = 0 and
DATEPART('hour',[Start]) >= 18
then 0

elseif DATEPART('minute',[Start]) = 0
then 0 
END

4.Call [结束时间]。与 #2 相同,找出开始时间与 [结束] 时间之间的差异

IF
DATEPART('hour',[End]) >= 9 then DATEPART('hour',[End]) - 9
END

5.Call 它 [End Min],与 #4 相同,找出你的开始分钟和你的 [End] 分钟之间的差异

DATEPART('minute',[End])

6.Call it [Total Hour],计算总小时数。两部分,第一部分是如果 [Start] 和 [End] 在同一日期,则只使用差异。第二部分,如果他们不在同一天,那么像这样的公式(再次将 9 替换为您的营业时间) 总和(开始和结束的小时数)+ 中间的天数 * 业务 hours/day – 中间的周末 * 业务 hour/day

if
DATEDIFF('day',[Start],[End])=0 and
datepart('hour',[Start])- datepart('hour',[End]) =0
then
0

elseif
DATEDIFF('day',[Start],[End])=0 and
datepart('hour',[Start])- datepart('hour',[End]) !=0 and
datepart('minute',[Start])- datepart('minute',[End])<=0
then
DATEPART('hour',[End]) - DATEPART('hour',[Start])

elseif  DATEDIFF('day',[Start],[End])=0 and
datepart('hour',[Start])- datepart('hour',[End]) !=0 and
datepart('minute',[Start])- datepart('minute',[End])>0
then
DATEPART('hour',[End]) - DATEPART('hour',[Start]) -1

elseif
DATEDIFF('day',[Start],[End]) > 0
then
([Start Hour]+[End Hour])+
(DATEDIFF('day',[Start],[End]) -1)
* 9
- [Weekends Count]*9
END

7.Call它[Total Min],计算总分钟数

if DATEDIFF('day',[Start],[End]) =0
and DATEPART('minute',[End])-DATEPART('minute',[Start])>=0
then DATEPART('minute',[End])-DATEPART('minute',[Start])

elseif DATEDIFF('day',[Start],[End]) =0
and DATEPART('minute',[End])-DATEPART('minute',[Start])<0
then 60 + DATEPART('minute',[End])-DATEPART('minute',[Start])

elseif DATEDIFF('day',[Start],[End]) !=0
then [Start Min]+[End Min]
end

DONE,这是你的总小时数和总分钟数在两个时间戳之间的差值,并且只在你的工作时间工作,没有周末。如果有任何拼写错误或错误,请告诉我。

为简单起见,我找到了另一个解决方案:

DATEDIFF('day', [Final Date], [Initial Date], 'monday')
-
(WEEK([Final Date])-WEEK([Initial Date]))*2

有了这个,您可以简单地计算 2 个日期之间的天数并减去周末。这是周之间的内部减法,你实现的是获得两个日期之间已经过去的周数,例如

Initial Date = 01/01/2021 --> Week([Initial Date]) = 1
Final Date = 08/01/2021 --> Week([Final Date]) = 2
The consecuent substract: Week([Final Date]) - Week([Initial Date]) = 1
(By multiplying by 2, you get Saturday and Sunday)