You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询,在日期范围内展示无记录日期的0统计值

解决MySQL指定日期范围无记录日期显示0计数的问题

你当前的查询 SELECT COUNT(*), created_date FROM my_table GROUP BY created_date; 仅返回存在数据记录的日期统计结果,无记录的日期会直接缺失,导致统计图不完整。针对MySQL 8.0及以上版本(2018年4月发布,已支持递归CTE),可以用以下方案补全所有日期并显示0计数:

递归生成日期范围+左联统计

WITH RECURSIVE date_range AS (
    -- 定义日期范围起始点:示例为当月第一天,可替换为指定起始日期
    SELECT DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AS date_day
    UNION ALL
    -- 递归生成后续日期,直到范围结束点:示例为当月最后一天
    SELECT DATE_ADD(date_day, INTERVAL 1 DAY)
    FROM date_range
    WHERE date_day < LAST_DAY(CURRENT_DATE)
)
-- 左联原表统计每日数据量
SELECT 
    dr.date_day AS created_date,
    COUNT(t.created_date) AS total_count
FROM date_range dr
LEFT JOIN my_table t ON dr.date_day = t.created_date
GROUP BY dr.date_day
ORDER BY dr.date_day;

代码说明

  • RECURSIVE CTE负责生成指定范围内的所有连续日期,示例为当月,你可按需修改起始和结束条件:比如要生成2024-01-01到2024-01-10的日期,就把起始日期改成'2024-01-01',结束条件改成date_day < '2024-01-11'
  • 左联my_table后,无匹配记录的日期对应的t.created_date为NULL,COUNT(t.created_date)会自动忽略NULL值,返回0
  • 按日期排序保证结果是连续的日期序列

关于旧线程的说明

此前有旧线程提及MySQL不支持递归,但MySQL 8.0及以上版本已支持递归CTE语法,现在可直接用上述方案解决问题。

内容的提问来源于stack exchange,提问作者Michael Cropper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:47:46