我有一个查询,可以获取两个日期范围之间的数据。
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
我需要它为指定日期范围之间缺少的月份返回零。
这可行吗? 我检查了我能找到的每个网站,但没有任何可以帮助我的网站。
答案 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/