最近需要用mysql获取一个时间段中的所有月份,网上查都是要设置存储过程或者加一个日期表的,不满足我的需求。并且从某博客查找到的并不满足mysql数据库版本8.0.11的要求(测试mysql数据库版本5.7.33的可以),所以结合自己查找的资料,修改得到需求。
获取某月份中的所有日期
select DATE_FORMAT(m1, '%Y-%m-%d') full_month,
DATE_FORMAT(m1, '%d日') format_date
from(
select
(concat('2021-04','-01') - INTERVAL DAYOFMONTH(concat("2021-04","-01"))-1 DAY)
+INTERVAL m DAY 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 1 union select 2 union select 3 union select 4) t5,
(select @rownum:=-1) t0
) d1
) d2
where m1< date_format(DATE_ADD(concat('2021-04','-01'), INTERVAL 1 MONTH),'%Y-%m-%d')
order by m1
上面代码段所用的的一些DATE_FORMAT(日期格式化)、CONCAT(字符串连接)、DATE_ADD(日期加法)等一些函数可以自行百度用法。此处不再赘述。
获取mysql中两个日期之间的月份列表
select DATE_FORMAT(m1, '%Y-%m') full_month,DATE_FORMAT(m1, '%Y年%m月') format_month
from(
select
('2021-04-01' - INTERVAL DAYOFMONTH('2021-05-03')-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<= '2021-05-03'
order by m1
类似上面的。