如何解决计算经过时间DATEDIFF,同时减去休息时间和午餐时间
我有一张桌子,看起来像:
job | start_time | end_time
----------------------------------------------------------
1 | 2020-08-31 09:46:00.000 | 2020-08-31 12:37:00.000
2 | 2020-08-31 09:54:00.000 | 2020-08-31 10:24:00.000
3 | 2020-08-31 05:52:00.000 | 2020-08-31 06:32:00.000
4 | 2020-08-31 05:02:00.000 | 2020-08-31 13:24:00.000
我需要以elapsed_time
和start_time
之间的分钟数来计算end_time
,但是如果elapsed_time
跨越8:45am
和{{1},则减去15分钟}和/或30分钟(如果9:00am
跨越elapsed_time
和11:30am
。
输出应如下所示:
12:00pm
谢谢您的帮助!
编辑:
我目前通过以下方式计算分钟数:
job | start_time | end_time | elapsed_time
-------------------------------------------------------------------------
1 | 2020-08-31 09:46:00.000 | 2020-08-31 12:37:00.000 | 141
2 | 2020-08-31 09:54:00.000 | 2020-08-31 10:24:00.000 | 30
3 | 2020-08-31 05:52:00.000 | 2020-08-31 06:32:00.000 | 40
4 | 2020-08-31 05:02:00.000 | 2020-08-31 13:24:00.000 | 457
然后将数据集导出到excel并从那里手动进行计算。
解决方法
以下内容为显示的示例数据返回所需的结果。但是,假设时间段始终在一天之内。并且假定没有时间段在休息时间内开始或结束(我将其留给您作为练习)。
诀窍是使用case
表达式来检测何时发生重叠并对其进行调整。
还请注意,使用子查询/派生表可以避免在整个查询中重复相同的转换和静态值。
declare @Test table (job int,start_time datetime,end_time datetime);
insert into @Test (job,start_time,end_time)
values
(1,'2020-08-31 09:46:00.000','2020-08-31 12:37:00.000'),(2,'2020-08-31 09:54:00.000','2020-08-31 10:24:00.000'),(3,'2020-08-31 05:52:00.000','2020-08-31 06:32:00.000'),(4,'2020-08-31 05:02:00.000','2020-08-31 13:24:00.000');
select job,end_time,datediff(minute,end_time) [Total Mins],end_time)
- case when start_time < end_break and end_time > start_break then 15 else 0 end
- case when start_time < end_lunch and end_time > start_lunch then 30 else 0 end [Adjusted Mins]
from (
select job,convert(time,start_time) start_time,end_time) end_time,'08:45am') start_break,'09:00am') end_break,'11:30am') start_lunch,'12:00pm') end_lunch
from @Test
) X;
结果
job | start_time | end_time | Total Mins | Adjusted Mins
------------------------------------------------------------------------------------------
1 | 2020-08-31 09:46:00.000 | 2020-08-31 12:37:00.000 | 171 | 141
2 | 2020-08-31 09:54:00.000 | 2020-08-31 10:24:00.000 | 30 | 30
3 | 2020-08-31 05:52:00.000 | 2020-08-31 06:32:00.000 | 40 | 40
4 | 2020-08-31 05:02:00.000 | 2020-08-31 13:24:00.000 | 502 | 457
要考虑是否/在休息/午餐期间开始或结束的时间段
- 如果某个时间段开始并且在一个时间段内结束,则总分钟数应为零-这是一种特殊情况,一旦处理完毕,您就可以在其余逻辑中忽略。
- 如果开始是在休息时间段的中途,那么要减去的时间就是周期开始时间与休息时间之间的差。
- 如果您在中途休息时间结束,那么要减去的时间就是休息开始时间与期间结束时间之差。
注意:如果以后像这样设置样本数据,您将更快地获得帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。