特定の時間枠内にあるタスクの実行に費やした時間を計算することを検討しています。定義された時間枠内の分を計算するか?
私は時間ウィンドウ@WindowStart
と@WindowEnd
を定義する2つの入力パラメータを持っています。私は自分のタスクテーブルに[タスク開始]と[タスク終了]列を持っています。
タイムウィンドウ内のタスクに費やされた時間を計算する最も簡単な方法は何ですか?タスクは、@WindowStart
と@WindowEnd
の後に簡単に開始または終了できます。
特定の時間枠内にあるタスクの実行に費やした時間を計算することを検討しています。定義された時間枠内の分を計算するか?
私は時間ウィンドウ@WindowStart
と@WindowEnd
を定義する2つの入力パラメータを持っています。私は自分のタスクテーブルに[タスク開始]と[タスク終了]列を持っています。
タイムウィンドウ内のタスクに費やされた時間を計算する最も簡単な方法は何ですか?タスクは、@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)
私はかなりうーん、私は4を作成したTaskEndがWindowStart –