Создание списка названий месяцев между двумя датами в MySQL - PullRequest
4 голосов
/ 01 марта 2012

Как мне создать список всех названий месяцев, например, январь, февраль и т. Д. Между двумя датами.например, с 2012-02-01 по 2013-03-29 с MySQL .. тогда как февраль будет сгенерирован дважды, один для 2012 года, а другой 2013

1 Ответ

9 голосов
/ 01 марта 2012

Я думаю, это то, что вы ищете:

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 позволит вам указать даты, между которыми вы хотите фильтровать результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...