Расчет общей продолжительности событий за день - PullRequest
1 голос
/ 25 октября 2011

У нас есть таблица с именем Events, со столбцами Id (int), EventDate (DateTime), EventStart (datetime) и EventEnd (datetime).

Все события начинаются и заканчиваются в один день (т.е. нетсобытия заканчиваются на следующий день), однако события в определенную дату могут перекрываться между собой (в том числе одно из них может полностью охватывать другое).

Любое количество событий может произойти за данную дату.

Я бы хотел, чтобы за один день вычислили общую продолжительность, в течение которой хотя бы одно событие выполнялось в T-SQL.Я могу выбрать события на определенную дату и даже написал функцию, возвращающую true, если два события перекрываются, и false, если нет.

Однако я застрял в том, как взять записи в парах и просмотреть их.моя функция, добавляя длительности соответственно, пока у меня не закончатся события.

Вы можете помочь?

Крис

1 Ответ

1 голос
/ 25 октября 2011

Попробуйте это:

--test table
declare @t table(fromt datetime, tot datetime)
--test data
insert @t values('2011-01-01 10:00', '2011-01-01 11:00')
insert @t values('2011-01-01 10:00', '2011-01-01 10:05')
insert @t values('2011-01-01 10:30', '2011-01-01 11:30')
insert @t values('2011-01-01 12:00', '2011-01-01 12:30')
insert @t values('2011-01-02 12:00', '2011-01-02 12:30')

--query
;with f as
(
    select distinct fromt from @t t 
    where not exists(select 1 from @t where t.fromt > fromt and t.fromt < tot)
), t as
(
    select distinct tot from @t t 
    where not exists(select 1 from @t where t.tot >= fromt and t.tot < tot)
), s as
(
    select datediff(day, 0, fromt) d, datediff(second, fromt, (select min(tot) 
      from t where f.fromt < tot and datediff(day, f.fromt, tot) = 0)) sec 
    from f
)
select dateadd(day, 0, d) day, sum(sec)/60 [minutes]
from s
group by d
order by d

Результат:

day                     minutes
----------------------- -------
2011-01-01 00:00:00.000 120
2011-01-02 00:00:00.000 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...