Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获取最近12个月的数据,如果找不到该月的数据,则插入0_Mysql_Sql - Fatal编程技术网

Mysql 如何获取最近12个月的数据,如果找不到该月的数据,则插入0

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

我尝试使用下面的查询在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 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我得到的响应是我没有全部的月数数据