Вы можете использовать что-то вроде этого: http://blogs.msdn.com/b/sqlazure/archive/2010/09/16/10063301.aspx
Чтобы сгенерировать эквивалент таблицы чисел, используя диапазоны дат.
Но не могли бы вы уточнить ваши входы и выходы?
Хотите ли вы ввести дату начала, например, '2010-5-1'
, и дату окончания, например, '2010-8-1'
, и будет ли она возвращаться каждый месяц между двумя? Вы хотите включить начальный и конечный месяц или исключить их?
Вот некоторый код, который я написал, который будет быстро генерировать инклюзивный результат каждого месяца между двумя датами.
--Inputs here:
DECLARE @StartDate datetime;
DECLARE @EndDate datetime;
SET @StartDate = '2010-1-5 5:00PM';
SET @EndDate = GETDATE();
--Procedure here:
WITH RecursiveRowGenerator (Row#, Iteration) AS (
SELECT 1, 1
UNION ALL
SELECT Row# + Iteration, Iteration * 2
FROM RecursiveRowGenerator
WHERE Iteration * 2 < CEILING(SQRT(DATEDIFF(MONTH, @StartDate, @EndDate)+1))
UNION ALL
SELECT Row# + (Iteration * 2), Iteration * 2
FROM RecursiveRowGenerator
WHERE Iteration * 2 < CEILING(SQRT(DATEDIFF(MONTH, @StartDate, @EndDate)+1))
)
, SqrtNRows AS (
SELECT *
FROM RecursiveRowGenerator
UNION ALL
SELECT 0, 0
)
SELECT TOP(DATEDIFF(MONTH, @StartDate, @EndDate)+1)
DATEADD(month, DATEDIFF(month, 0, @StartDate) + A.Row# * POWER(2,CEILING(LOG(SQRT(DATEDIFF(MONTH, @StartDate, @EndDate)+1))/LOG(2))) + B.Row#, 0) Row#
FROM SqrtNRows A, SqrtNRows B
ORDER BY A.Row#, B.Row#;