2011-12-16 6 views
0

特定の時間枠内にあるタスクの実行に費やした時間を計算することを検討しています。定義された時間枠内の分を計算するか?

私は時間ウィンドウ@WindowStart@WindowEndを定義する2つの入力パラメータを持っています。私は自分のタスクテーブルに[タスク開始]と[タスク終了]列を持っています。

タイムウィンドウ内のタスクに費やされた時間を計算する最も簡単な方法は何ですか?タスクは、@WindowStart@WindowEndの後に簡単に開始または終了できます。

答えて

1

何がしたいことは、タスクの長さを見つけることですが、完全にウィンドウに含まれている場合:

select [task end] - [task start] as taskDuration 
from tasktable 
where [task start] > @WindowStart and [task end] < @WindowEnd 

あなたが窓を持つ任意の重複を持っている期間を見たい代わり場合は、単に反転し、へまたは。

+0

私はかなりうーん、私は4を作成したTaskEndがWindowStart –

0

これは機能する場合がありますか?タスクの開始/終了時間がウィンドウの開始/終了時間の外側にある場合、その差は負になります。いくつかのシナリオがあります:

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 
+0

選択ウィンドウにしていたものを一部を計算するためにあなたの入力とUDFの組み合わせを使用して終了私の元の投稿のテストケース、最後はTaskEndがWindowStartの前のケースです。私はちょうどそれを再テストし、それは私のために働くようです。あなたにとってはそれほど魅力的ではなかったことは? – deroby

+0

前にある状況をキャッチしません –

+0

私の悪い、あなたが上に重複していない場合には負の数を得ることを上に述べたことを見たことがなかった....私には、私たちが欲しいものではないが、再び、詳細については貧弱なものです... – deroby

0

タスクの開始/終了を単に適切な制限に移動します。 これは、開始時刻が終了時刻の前に来ることを必要とすることを念頭に置いてください。いずれかのペアが逆転した場合、最初にそれらをシフトする必要があります。それでは、もう一度、現実世界で始まる前に終わったら? =)

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) 
関連する問題