Вы можете сделать это с помощью специальной таблицы подсчета. Использование spt_values, но любая большая таблица будет делать.
Кроме того, этот подход будет быстрее, чем рекурсивный КТР, особенно для больших наборов
declare @from date = '2016-09-15'
declare @to date = '2016-12-25'
Select Month = max(DateName(MONTH,D))
,Start_date = min(D)
,End_date = max(D)
From (Select Top (DateDiff(DD,@from,@to)+1) D=DateAdd(DD,Row_Number() Over (Order By (Select null))-1,@from) From master..spt_values) A
Group By Year(D),Month(D)
Order By min(d)
Возвращает
Month Start_date End_date
September 2016-09-15 2016-09-30
October 2016-10-01 2016-10-31
November 2016-11-01 2016-11-30
December 2016-12-01 2016-12-25
Edit - Как Запрошенный
процесс действительно не что сложно. Мы используем Row_Number() совместно с DateAdd() для создания списка дат в пределах указанного диапазона дат.
Суб-запрос выдает следующие
D
2016-09-15
2016-09-16
2016-09-17
2016-09-18
2016-09-19
2016-09-20
2016-09-21
2016-09-22
2016-09-23
...
2016-12-20
2016-12-21
2016-12-22
2016-12-23
2016-12-24
2016-12-25
Тогда становится простым вопросом получения/макс даты мин на год/месяц.
Опять же, я использовал master..spt_values
, но практически любая таблица сделана. Если у вас нет таблицы с таблицами/цифрами, я бы настоятельно рекомендовал ее.
Просьба ** EXPLAIN ** на простом английском языке, что вы пытаетесь выполнить - не просто оставляйте нас ** угадыванием ** и недоумевая, что вы пытаетесь сделать! –