Вот итеративное решение, которое будет работать в течение любого периода времени, когда время начала раньше времени окончания.Вы не указали, хотите ли вы, чтобы компонент даты для отчетных интервалов времени в разные дни в 8 часов утра находился на другой строке, или же вы хотите сгруппировать их.Было бы довольно легко отказаться от компонента даты, преобразовав столбец time_bucket в моем решении в varchar, затем подстроку, сгруппировав по этому varchar, а затем сложив секунды в этой группе.
Если вы выполняете анализ по временитогда у вас, вероятно, должна быть таблица измерений временных интервалов, аналогичная той, что предлагает Ливен в своем решении.Это решает ваши проблемы кардинальности.Без этого вам пришлось бы делать что-то вроде этого:
create table #results
( name varchar(20) not null, time_bucket datetime not null, seconds int not null )
declare @name varchar(20), @startTime datetime, @endTime datetime, @timeBucket datetime, @secondsInBucket int
declare dataCur cursor for select * from source_data
open dataCur
fetch next from dataCur into @name, @startTime, @endTime
while @@fetch_status = 0
begin
set @timeBucket = convert(datetime, convert(varchar(14), @startTime, 120) + convert(varchar(2), (datepart(mi, @startTime) / 5) * 5), 120)
while @timeBucket < @endTime
begin
set @secondsInBucket = case
when @timeBucket < @startTime then datediff(ss, @startTime, dateadd(mi, 5, @timeBucket))
when @endTime < dateadd(mi, 5, @timeBucket) then datediff(ss, @timeBucket, @endTime)
else 300
end
insert into #results values (@name, @timeBucket, @secondsInBucket)
set @timeBucket = dateadd(mi, 5, @timeBucket)
end
fetch next from dataCur into @name, @startTime, @endTime
end
close dataCur
deallocate dataCur
select * from #results