在mysql查询中用零替换缺少的月份

时间:2014-10-16 19:58:41

标签: mysql date datetime

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

    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

我需要它为指定日期范围之间缺少的月份返回零。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

第三,您需要一个包含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

只要您只选择一个日历年内的日期,我们就会有效 - 我们只有12个月的时间。值得整数。

从整数中获取月份名称会有一些棘手的问题。

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