Я думаю, это то, что вы ищете:
select MonthName(aDate) from (
select @maxDate - interval (a.a + (10 * b.a) + (100 * c.a)) month as aDate from
(select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) a,
(select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) b,
(select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) c,
(select @minDate := '2012-02-01', @maxDate := '2013-03-29') d
) e
where aDate between @minDate and @maxDate
На всякий случай, если кто-то найдет этот пост и поймет, что его немного сложнее понять, я добавлю краткое объяснение:
Это динамическое (и немного некрасивое) решение для создания диапазона дат, которое не требует создания таблицы и основано на следующем запросе, который генерирует достаточно записей для большинства приложений (10000 записей):
select aDate from (
select @maxDate - interval (a.a+(10*b.a)+(100*c.a)+(1000*d.a)) day aDate from
(select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) a, /*10 day range*/
(select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) b, /*100 day range*/
(select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) c, /*1000 day range*/
(select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) d, /*10000 day range*/
(select @minDate := '2001-01-01', @maxDate := '2002-02-02') e
) f
where aDate between @minDate and @maxDate
В зависимости от длины диапазона дат вы можете уменьшить количество динамически генерируемых результатов (10000 дней означают более 27 лет записей, каждая из которых представляет один день), удаляя таблицы (d, c, b и aв этом порядке), а также удаляя их из верхней формулы.Установка переменных @minDate
и @maxDate
позволит вам указать даты, между которыми вы хотите фильтровать результаты.