我有一个查询来检索两个日期之间每天的事件总数。
SELECT
DATE_FORMAT(startTime, '%Y%m%d') as day,
COUNT(0) as numEvents
FROM events
WHERE
(startTime BETWEEN 20140105000000 AND 20140112235900)
GROUP BY
day;
返回类似
的列表day | numEvents
---------+----------
20140105 | 45
20140107 | 79
20140108 | 12
20140109 | 56
请注意,结果中缺少天数,因为当天事件表中没有事件。有没有办法在那些日子返回0值,结果是:
day | numEvents
---------+----------
20140105 | 45
20140106 | 0
20140107 | 79
20140108 | 12
20140109 | 56
20140110 | 0
20140111 | 0
20140112 | 0
答案 0 :(得分:0)
SO上有很多解决方案:
One solution是另一张包含所有可能/相关日期的表格。可以在此处找到一个实现:https://stackoverflow.com/a/7262803/1085891
这通常通过具有日期维度在数据仓库中完成 有一个所有可能日期的列表。你做了一个OUTER JOIN 日期维度和COALESCE将空值设为0。
如果经常运行,存储日期会更有效。但是,对于快速报告,您可以生成所需的日期,并将输出加入到您要搜索的表中。
答案 1 :(得分:0)
试试这个
SELECT DATE_FORMAT(startTime, '%Y%m%d') as day, COUNT(DATE_FORMAT(startTime, '%Y%m%d'))
FROM events
WHERE
(startTime BETWEEN 20140105000000 AND 20140112235900)
GROUP BY day;
答案 2 :(得分:0)
如果startTime
是另一个具有每个日期值的表的foreign_key,则可以执行此操作。这是关于数据仓库的多维模型的典型,其中您有日期/时间维度,并且它们包括所有日期。
在这种情况下,我认为Vigens Kumar提供的解决方案可行:
SELECT DATE_FORMAT(startTime, '%Y%m%d') as day, COUNT(DATE_FORMAT(startTime, '%Y%m%d'))
FROM events
WHERE
(startTime BETWEEN 20140105000000 AND 20140112235900)
GROUP BY day;