Получение месяца, разделенного запятыми, для заданного месяца и месяца с использованием рекурсивного CTE

У нас есть требование, когда в качестве входных данных предоставляются 2 месяца и 2 года. И результат должен содержать месяц-год, разделенный запятой, между месяцем-годом и месяцем-годом.

Скажем, у нас есть

From Month is 'Jan' 
From Year is 2011
To Month is 'Apr'
To Year is 2011

желаемый результат

Jan'11,Feb'11,Mar'11,Apr'11

Можно ли этого добиться с помощью рекурсивного CTE? Нам нужно добиться этого с помощью рекурсивного CTE. Может ли кто-нибудь помочь мне в этом.


person suryakiran    schedule 10.10.2011    source источник
comment
Почему конкретное рекурсивное требование CTE?   -  person Martin Smith    schedule 10.10.2011
comment
Мы уже создали функцию для достижения того же. Но с производительностью и для смягчения других проблем мы собираемся использовать рекурсивное CTE.   -  person suryakiran    schedule 10.10.2011
comment
Это исключает некоторые другие потенциальные подходы, такие как XML PATH, которые могут быть (или не быть) более эффективными.   -  person Martin Smith    schedule 10.10.2011


Ответы (1)


Попробуйте этот код:

--declaration of variables
declare @frommonth char(3) = 'jan',@fromyear char(4) = 2011,
        @tomonth char(3) = 'APR', @toyear char(4) = 2011
         
declare @output varchar(max)
declare @f int, @t int 

select --setting from and to month as months after 1900-01-01
@f = datediff(month, 0, cast('1' +@frommonth+@fromyear as datetime)),
@t = datediff(month, 0, cast('1' +@tomonth+@toyear as datetime))

-- recusive loop
;with cte as
(
select @f m
union all
select m + 1 from cte
where m < @t
)
select @output = coalesce(@output +',', '') +stuff(convert(varchar(11),dateadd(mm, m, 0), 109), 4, 6, '''') FROM CTE

select @output

Результат:

Jan'11,Feb'11,Mar'11,Apr'11

Тест здесь:

https://data.stackexchange.com/stackoverflow/q/114801/declaration-of-variables

person t-clausen.dk    schedule 10.10.2011
comment
Это здорово. Большое спасибо - person suryakiran; 10.10.2011