我必须在 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:=@rownum+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. 设置日期变量 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
下面的这个 SQL 对我的 MYSQL 有帮助。您可以根据需要更新 curdate() 值以获取任何月份的日期列表。链接:(https://www.programmersought.com/article/26156494713/)
SELECT DATE_FORMAT(DATE_SUB(last_day(curdate()), INTERVAL xc-1 day), '%Y-%m-%d') as date
FROM (
SELECT @xi:=@xi+1 as xc from
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) xc1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) xc2,
(SELECT @xi:=0) xc0
) xcxc) x0 where x0.date >= (select date_add(curdate(),interval-day(curdate())+1 day))