【问题标题】:substitude zeros for missing months in mysql query用零替换mysql查询中缺少的月份
【发布时间】:2014-10-16 19:58:41
【问题描述】:

我有一个查询可以获取两个日期范围之间的数据。

    SELECT  
            MONTH(ENC_DT)         as Month, 
            monthname(ENC.ENC_DT) as Month_Name,
            year(ENC.ENC_DT)      as Year,
            ENC.ENC_DT,
            ENC.ENC_ID

    FROM
            IDR_ENC ENC

    where                   
            DATE_FORMAT(ENC.ENC_DT, '%Y-%m-%d') >= '2014-01-01' and 
            DATE_FORMAT(ENC.ENC_DT, '%Y-%m-%d') <= '2014-10-16' 
    GROUP BY Month_Name, Year

我需要它为指定日期范围内缺失的月份返回零。

这可行吗? 我检查了所有能找到的网站,但没有任何帮助。

【问题讨论】:

标签: mysql date datetime


【解决方案1】:

我假设您在结果集中询问与表中没有数据的月份相对应的行。

首先,您误用了GROUP BY 的MySQL 扩展。请阅读这个。 http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html 当您滥用该扩展程序时,我们和服务器都很难猜测您想要什么。

第三,您的WHERE 子句中不需要DATE_FORMAT() 内容。可以直接比较日期。

第三,您需要一个包含从 1 到 12 的所有数字的表。这在简单的查询中很容易生成,如下所示。稍后我们将使用它。

        SELECT 1 AS seq UNION SELECT 2  UNION SELECT 3 UNION SELECT 4 UNION
        SELECT 5 UNION SELECT 6  UNION SELECT 7 UNION SELECT 8 UNION 
        SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12

第四,您需要将您的数字列表加入到您的其他表格中。

SELECT seq.seq            as Month, 
       MONTHNAME(CONCAT( YEAR(NOW()), '-', seq.seq, '-01')) as Month_Name,
       year(ENC_DT)       as Year
       COUNT(*)           as ENC_Record_Count
FROM  (
        SELECT 1 AS seq UNION SELECT 2  UNION SELECT 3 UNION SELECT 4 UNION
        SELECT 5 UNION SELECT 6  UNION SELECT 7 UNION SELECT 8 UNION 
        SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
      ) AS seq 
LEFT JOIN IDR_ENC AS ENC ON seq.seq = MONTH(ENC.ENC_DT)
where ENC.ENC_DT >= '2014-01-01'  
and   ENC.ENC_DT  <= '2014-10-16' 
group by year(ENC.ENC_DT),seq.seq
order by year(ENC.ENC_DT),seq.seq

只要您只选择一个日历年内的日期,这将起作用——我们只有十二个月的整数。

从整数中获取月份名称有些棘手。

有关此类查询的更详细讨论,请参阅此内容。 http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多