Вот еще одно нерекурсивное решение на основе множеств, в котором используется системная таблица с именем master..spt_values
:
DECLARE
@StartTime datetime = '2011-07-20 11:00:33',
@EndTime datetime = '2011-07-20 15:37:34',
@Interval int = 554;
SELECT
StartTime = DATEADD(SECOND, (number - 1) * @Interval, @StartTime),
EndTime = DATEADD(SECOND, (number - 0) * @Interval, @StartTime),
Duration = @Interval
FROM master..spt_values
WHERE type = 'P'
AND number BETWEEN 1 AND DATEDIFF(SECOND, @StartTime, @Endtime) / @Interval
UNION ALL
SELECT
DATEADD(SECOND, -Duration, EndTime),
EndTime,
Duration
FROM (
SELECT
EndTime = @EndTime,
Duration = DATEDIFF(SECOND, @StartTime, @Endtime) % @Interval
) s
WHERE Duration > 0
Первый SELECT генерирует набор строк, состоящий из коротких интервалов указанной длины, которые лежат в указанном диапазоне. При необходимости второй SELECT добавляет интервал между временем окончания последнего интервала первого SELECT и указанным временем окончания.
Подмножество master..spt_values
, которое особенно используется здесь (и может использоваться во многих подобных случаях), предоставляет список чисел от 0 до 2047. Это означает, что вы не сможете использовать это решение с таблица, если начальный интервал будет разбит на более чем 2047 коротких (er) интервалов. Затем вы должны подумать о чем-то вроде вашей таблицы чисел .