Подтвердить что ты не робот

Как получить список месяцев между двумя датами в mysql

Я хочу получить список месяцев между двумя датами в mysql.

For Example:My Input is

 From date 23-01-2013
 To Date   01-04-2014

Output Should be 

Jan   2013,
Feb   2013,
March 2013,
.
.
.
Jan   2014,
Feb   2014,
Mar   2014,
Apr   2014.
4b9b3361

Ответ 1

демоверсия SQLFiddle

select 
DATE_FORMAT(m1, '%b %Y')

from
(
select 
('2013-01-23' - INTERVAL DAYOFMONTH('2013-01-23')-1 DAY) 
+INTERVAL m MONTH as m1
from
(
select @rownum:[email protected]+1 as m from
(select 1 union select 2 union select 3 union select 4) t1,
(select 1 union select 2 union select 3 union select 4) t2,
(select 1 union select 2 union select 3 union select 4) t3,
(select 1 union select 2 union select 3 union select 4) t4,
(select @rownum:=-1) t0
) d1
) d2 
where m1<='2014-04-01'
order by m1

Ответ 2

Это практическое решение, оно не так "элегантно", если вы хотите увидеть его таким образом, но он работает, и вы можете сделать его функцией и/или хранимой процедурой, просто с несколькими параметрами...

во-первых, нам нужна таблица с некоторыми записями, любая таблица.  мы будем использовать эту таблицу, как таблицу номеров строк. (вам понадобится столько строк за то же количество месяцев, которые вы хотите отобразить, имея большую таблицу) →

SELECT CONCAT(table_schema, '.', table_name) as schema_table, table_rows
FROM   information_schema.TABLES
order by 2 desc limit 0,100

это скажет вам, что 100 лучших таблиц с большинством записей в вашем экземпляре, я использую таблицу mysql.help для этого примера, по умолчанию это число содержит около тысячи записей, и все это там...

set @start_date = '2013-01-23';
set @end_date = '2014-04-01';
set @months = -1;

select DATE_FORMAT(date_range,'%M, %Y') AS result_date from (
    select (date_add(@start_date, INTERVAL (@months := @months +1 ) month)) as date_range
    from mysql.help_topic a limit 0,1000) a
where a.date_range between @start_date and last_day(@end_date);

поясняет:

1. установить даты variales 2. установить значение месяца, чтобы добавить месяцы 3. выберите для каждой строки, даты (мы добавляем месяц и увеличиваем месячную переменную в той же строке) 4. Даты фильтрации, которые находятся между диапазонами 5. Выходные даты.

это конечный результат →

January, 2013
February, 2013
March, 2013
April, 2013
May, 2013
June, 2013
July, 2013
August, 2013
September, 2013
October, 2013
November, 2013
December, 2013
January, 2014
February, 2014
March, 2014
April, 2014

Ответ 3

Попробуйте следующее:

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