Я хочу получить список месяцев между двумя датами в 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.
Я хочу получить список месяцев между двумя датами в 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.
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
Это практическое решение, оно не так "элегантно", если вы хотите увидеть его таким образом, но он работает, и вы можете сделать его функцией и/или хранимой процедурой, просто с несколькими параметрами...
во-первых, нам нужна таблица с некоторыми записями, любая таблица. мы будем использовать эту таблицу, как таблицу номеров строк. (вам понадобится столько строк за то же количество месяцев, которые вы хотите отобразить, имея большую таблицу) →
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
Попробуйте следующее:
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