среда, 26 октября 2011 г.

Формирование таблицы временных интервалов заданной длины

Не знаю как у вас, а у меня ни один проект еще не обошелся без написания какого-либо отчета с формированием статистики по определенным временным интервалам. И что больше всего повторяется, так это собственно формирование таблицы со списком этих интервалов. Вот на такой случай я и решил сделать эту заметку.

Каждый решает эту задачу по своему, самый простой вариант - это WHILE цикл со вставкой строки с новым интервалом во временную таблицу. Но начиная с 2005 MS SQL Server'а, благодаря Common Table Expression (CTE), теперь это можно сделать по-другому. Собственно пример (формирование интервалов продолжительностью в 2 дня за конкретный месяц):
set dateformat ymd
--
declare @StartDate datetime
declare @EndDate datetime
declare @Step int
--
set @StartDate = N'2011-09-01'
set @EndDate = N'2011-10-01'
set @Step = 2
--
declare @date datetime
set @date = @StartDate
--
declare @interval table (
int_start datetime primary key
,int_end datetime
)
--
;
with cte as (
select
@date as date1
,dateadd(day, @Step, @date) as date2
--
union all
--
select
C.date2
,dateadd(day, @Step, C.date2)
from cte C
where C.date2 < @EndDate
)
insert into @interval (
int_start
,int_end
)
select
date1
,date2
from cte
--
select * from @interval
GO
Еще хочу заметить, что этот вариант чуточку быстрее классического решения с циклом WHILE из-за меньше количества операций ввода\вывода.
З.Ы. Кому интересно - пользуйтесь на здоровье :)