如何在Tableau中计算排除周末的两日期间业务工作时长?
在Tableau中计算排除周末的业务工作时长
要解决这个问题,我们可以把整个时间段拆成三部分计算:开始当天的有效时长、结束当天的有效时长,以及中间完整工作日的总时长,最后把三者加起来。下面是具体的步骤,对应你的例子(2018-05-10 10:00 到 2018-05-14 11:00,工作时间9:00-18:00,周一到周五),最终结果会是19小时。
第一步:创建判断工作日的计算字段
首先我们需要一个字段来判断某个日期是否是工作日。Tableau里的DATEPART('weekday', [Date])返回的数字可能因地区设置不同(比如美国默认周日=1,周一=2;有些地区周一=1),你可以先自己测试下:
- 如果你的周一对应2、周五对应6(周日=1),创建计算字段
Is Workday:
IF DATEPART('weekday', [Date]) BETWEEN 2 AND 6 THEN TRUE ELSE FALSE END
- 如果你的周一对应1、周五对应5,就改成
BETWEEN 1 AND 5。
之后我们需要分别判断开始日期和结束日期是否是工作日,所以可以再创建两个字段(分开更清晰):
Is Workday (Start Date):把上面公式里的[Date]换成[Start Date]Is Workday (End Date):把上面公式里的[Date]换成[End Date]
第二步:计算中间完整工作日的数量
创建计算字段Full Workdays Between,用来统计开始日期次日到结束日期前一天之间的工作日总数:
DATEDIFF('day', DATEADD('day', 1, [Start Date]), DATEADD('day', -1, [End Date])) - (DATEDIFF('week', DATEADD('day', 1, [Start Date]), DATEADD('day', -1, [End Date])) * 2)
这个公式的逻辑是:先算中间的总天数,再减去这段时间里的周末天数(每周2天)。
第三步:计算开始当天的有效工作时长
创建计算字段Start Day Hours,计算开始日期当天实际能统计的工作时长:
IF [Is Workday (Start Date)] THEN DATEDIFF('hour', MAX([Start Date], DATETRUNC('day', [Start Date]) + MAKE_TIME(9,0,0)), MIN(DATETRUNC('day', [Start Date]) + MAKE_TIME(18,0,0), [Start Date]) ) + DATEDIFF('minute', MAX([Start Date], DATETRUNC('day', [Start Date]) + MAKE_TIME(9,0,0)), MIN(DATETRUNC('day', [Start Date]) + MAKE_TIME(18,0,0), [Start Date]) )/60 ELSE 0 END
逻辑说明:
- 如果开始日期不是工作日,时长为0
- 如果开始时间早于9:00,就从9:00开始算;如果晚于18:00,当天没有有效时长
- 同时计算小时和分钟,把分钟转成小时加进去,确保精度
第四步:计算结束当天的有效工作时长
创建计算字段End Day Hours,计算结束日期当天的有效时长:
IF [Is Workday (End Date)] THEN DATEDIFF('hour', MAX(DATETRUNC('day', [End Date]) + MAKE_TIME(9,0,0), [End Date]), MIN([End Date], DATETRUNC('day', [End Date]) + MAKE_TIME(18,0,0)) ) + DATEDIFF('minute', MAX(DATETRUNC('day', [End Date]) + MAKE_TIME(9,0,0), [End Date]), MIN([End Date], DATETRUNC('day', [End Date]) + MAKE_TIME(18,0,0)) )/60 ELSE 0 END
逻辑类似开始当天:
- 非工作日时长为0
- 结束时间早于9:00则当天0时长;晚于18:00则算到18:00
第五步:计算总业务工作时长
最后创建计算字段Total Business Hours,把三部分加起来:
[Start Day Hours] + ([Full Workdays Between] * 9) + [End Day Hours]
这里的9是每天的工作时长(18-9=9小时),如果你的工作时长不同,替换成对应数字即可。
验证你的例子
对应你的测试数据:
- 开始日期2018-05-10 10:00(周四,工作日):
Start Day Hours是8小时(10:00到18:00) - 中间完整工作日:从5.11到5.13,只有5.11(周五)是工作日,所以
Full Workdays Between=1,对应9小时 - 结束日期2018-05-14 11:00(周一,工作日):
End Day Hours是2小时(9:00到11:00) - 总和:8+9+2=19小时,完全符合预期!
内容的提问来源于stack exchange,提问作者Elaine H




