Mysql 如何获取最近12个月的数据,如果找不到该月的数据,则插入0
我尝试使用下面的查询在Mysql中获取过去12个月的数据,但我得到的是所有数据,不是过去12个月的数据,我在文章中读了一些,但很有帮助 我的CreatedDate格式类似于“2020-04-17 12:03:59”Mysql 如何获取最近12个月的数据,如果找不到该月的数据,则插入0,mysql,sql,Mysql,Sql,我尝试使用下面的查询在Mysql中获取过去12个月的数据,但我得到的是所有数据,不是过去12个月的数据,我在文章中读了一些,但很有帮助 我的CreatedDate格式类似于“2020-04-17 12:03:59” SELECT date_format(createdDate,'%m') as Month, count(*) as count, date_format(createdDate,'%Y') as Year FROM tablename WHERE
SELECT date_format(createdDate,'%m') as Month,
count(*) as count,
date_format(createdDate,'%Y') as Year
FROM tablename
WHERE DATE_ADD(Now(),INTERVAL- 12 MONTH)
GROUP BY Year,
Month
ORDER by Year desc,
Month desc;
如果当月未找到数据,您还需要帮助插入0。您可以在此处使用日历表:
SELECT
cal.dt,
COUNT(t.createdDate) AS count
FROM
(
SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS dt UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 4 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 5 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 6 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 7 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 8 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 9 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 10 MONTH), '%Y-%m') UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 11 MONTH), '%Y-%m')
) cal
LEFT JOIN tablename t
ON cal.dt = DATE_FORMAT(createdDate, '%Y-%m')
WHERE
t.createdDate >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY
cal.dt
ORDER BY
cal.dt DESC;
在MySQL 8+中,您可以使用递归CTE生成日期:
with recursive dates as (
select curdate() - interval (1 - day(curdate())) day as yyyymm, 1 as lev
union all
select yyyymm - interval 1 month, lev + 1
from dates
where lev < 12
)
select d.yyyymm, count(t.createdDate) as cnt
from dates d left join
tablename t
on t.createdDate >= d.yyyymm and
t.createdDate < d.yyyymm + interval 1 month
group by d.yyyymm;
请注意,这不会将年和月拆分为单独的列,但如果您确实愿意,可以这样做
此外,这将为当月提供部分数据。如果您只想要完整的月份,您可以调整逻辑。DATE\u ADDNow,INTERVAL-12 MONTH始终为true-因此您的WHERE不做任何操作。感谢它在过去12个月内工作正常,但是如果我想返回0,如果没有该月的可用数据,我如何实现。此解决方案已经完成了此操作,它会报告过去12个月的情况。如果某个月在您的表格中没有出现,它将报告该月的计数为零。不,我得到的响应低于2020-04 26 2020-01 1 2019-11 1我得到的响应是我没有全部的月数数据