Alexey Suvorov dev blog

Мой разработческий блог

Archive for Январь 2014

Разделение диапазона дат на фреймы

leave a comment »

Для отчётов в разрезе времени бывает необходимо разделить диапазон дат на более мелкие промежутки времени по часу или несколько минут. Для этого удобно использовать таблицу в каждой строке которой было бы начало и конец диапазона.

DECLARE @step int --= 15;
DECLARE @start datetime -- = '2014-01-01 00:00';
DECLARE @end datetime -- = '2014-01-01 10:00';

;WITH N(n) AS 
( 
 SELECT 0  UNION ALL SELECT n+1 FROM N WHERE N < (DateDiff (mi, @start, @end) / @step) 
)
SELECT 
	DateAdd(mi, n * @step, @start) AS [Start],
	DateAdd(mi, (n + 1) * @step, @start) AS [End]
FROM N
OPTION (MaxRecursion 32000)

Я предпочитаю оборачивать этот запрос в udf. У такого подхода есть досадное ограничение — udf не может содержать OPTION (MAXRECURSION N). Эта опция обязательно понадобится если диапазон дат большой или фрейм очень маленький. Но можно выставить эту опцию в конечном запросе.

Written by alexeysuvorov

18.01.2014 at 11:57 пп

Опубликовано в sql