[英]Calculating minutes within a defined time window?
我正在计算在特定时间范围内执行任务所花费的时间。
我有两个输入参数,它们定义了时间窗口@WindowStart
和@WindowEnd
并且在任务表中有[Task Start]和[Task End]列。
计算在我的时间范围内的任务上花费的时间的最简单方法是什么? 可以在@WindowStart
和@WindowEnd
之后轻松地开始或结束任务。
如果要查找的任务长度完全包含在窗口中:
select [task end] - [task start] as taskDuration
from tasktable
where [task start] > @WindowStart and [task end] < @WindowEnd
相反,如果您要查看与窗口有任何重叠的持续时间,只需将和翻转为或。
这可能有效吗? 如果任务的开始/结束时间不在窗口的开始/结束时间之内,则差异为负。 有以下几种情况:
select TestDates.*,
DATEDIFF(minute,
CASE WHEN TestDates.WindowStart > TestDates.TaskStart
THEN TestDates.WindowStart ELSE TestDates.TaskStart END,
CASE WHEN TestDates.WindowEnd < TestDates.TaskEnd
THEN TestDates.WindowEnd ELSE TestDates.TaskEnd END
) as Interval
from
(
SELECT GETDATE() as WindowStart,
dateadd(minute, 10, GETDATE()) as WindowEnd,
dateadd(minute, 2, GETDATE()) as TaskStart,
dateadd(minute, 14, GETDATE()) as TaskEnd
) as TestDates
select TestDates.*,
DATEDIFF(minute,
CASE WHEN TestDates.WindowStart > TestDates.TaskStart
THEN TestDates.WindowStart ELSE TestDates.TaskStart END,
CASE WHEN TestDates.WindowEnd < TestDates.TaskEnd
THEN TestDates.WindowEnd ELSE TestDates.TaskEnd END
) as Interval
from
(
SELECT GETDATE() as WindowStart,
dateadd(minute, 10, GETDATE()) as WindowEnd,
dateadd(minute, -2, GETDATE()) as TaskStart,
dateadd(minute, 20, GETDATE()) as TaskEnd
) as TestDates
select TestDates.*,
DATEDIFF(minute,
CASE WHEN TestDates.WindowStart > TestDates.TaskStart
THEN TestDates.WindowStart ELSE TestDates.TaskStart END,
CASE WHEN TestDates.WindowEnd < TestDates.TaskEnd
THEN TestDates.WindowEnd ELSE TestDates.TaskEnd END
) as Interval
from
(
SELECT GETDATE() as WindowStart,
dateadd(minute, 10, GETDATE()) as WindowEnd,
dateadd(minute, 20, GETDATE()) as TaskStart,
dateadd(minute, 30, GETDATE()) as TaskEnd
) as TestDates
select TestDates.*,
DATEDIFF(minute,
CASE WHEN TestDates.WindowStart > TestDates.TaskStart
THEN TestDates.WindowStart ELSE TestDates.TaskStart END,
CASE WHEN TestDates.WindowEnd < TestDates.TaskEnd
THEN TestDates.WindowEnd ELSE TestDates.TaskEnd END
) as Interval
from
(
SELECT GETDATE() as WindowStart,
dateadd(minute, 10, GETDATE()) as WindowEnd,
dateadd(minute, -20, GETDATE()) as TaskStart,
dateadd(minute, -10, GETDATE()) as TaskEnd
) as TestDates
只需将任务的开始/结束更改为适当的限制即可。 请注意,这要求开始时间早于结束时间,如果任何一对反转,则需要先转移它们,否则会得到奇怪的结果。 再说一次,在现实世界开始之前什么时候结束? =)
DECLARE @task_start datetime,
@task_end datetime,
@window_start datetime,
@window_end datetime
SELECT @window_start = '09:00',
@window_end = '17:00',
@task_start = '11:15',
@task_end = '19:22'
SELECT time_spent = (CASE WHEN @task_start > @window_end THEN 0
WHEN @task_end < @window_start THEN 0
ELSE DateDiff(minute, (CASE WHEN @task_start < @window_start THEN @window_start
ELSE @task_start END),
(CASE WHEN @task_end > @window_end THEN @window_end
ELSE @task_end END))
END)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.