[英]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.