Archive for Январь 2014
Разделение диапазона дат на фреймы
Для отчётов в разрезе времени бывает необходимо разделить диапазон дат на более мелкие промежутки времени по часу или несколько минут. Для этого удобно использовать таблицу в каждой строке которой было бы начало и конец диапазона.
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). Эта опция обязательно понадобится если диапазон дат большой или фрейм очень маленький. Но можно выставить эту опцию в конечном запросе.