Вычисление минут в пределах определенного временного окна? - PullRequest
0 голосов
/ 16 декабря 2011

Я рассчитываю, сколько минут потрачено на выполнение задачи, которая находится в определенном временном окне.

У меня есть два входных параметра, определяющих временное окно @WindowStart и @WindowEnd, и у меня есть столбцы [Начало задачи] и [Окончание задачи] в моей таблице задач.

Какой самый простой способ рассчитать время, затраченное на задачу, которая находится в моем временном окне?Задачи могут легко начинаться или заканчиваться после @WindowStart и @WindowEnd.

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Если вы хотите узнать, сколько заданий целиком содержится в окне:

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

Если вместо этого вы хотите посмотреть на длительности, которые имеют какое-либо перекрытие с окном, просто переключите и на или.

0 голосов
/ 17 декабря 2011

Просто сдвиньте начало / конец задачи к соответствующим пределам.Имейте в виду, что для этого необходимо, чтобы время начала наступало раньше времени конца, если какая-либо из пар поменялась местами, вам сначала нужно их переместить, иначе вы получите странные результаты.Опять же, когда когда-нибудь конец, прежде чем начать в реальном мире?=)

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)
0 голосов
/ 16 декабря 2011

Это может сработать? Если время начала / окончания задачи находится вне времени начала / окончания окна, разница будет отрицательной. Есть несколько сценариев:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...