簡體   English   中英

在規定的時間范圍內計算分鍾?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM