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

MySQL实现当月每日记录查询:无记录日期也需展示

嘿,这个需求我太懂啦!要实现当前月份每天都出现在结果里——哪怕当天没有对应记录,核心思路就是先生成当前月的完整日期列表,再和你的数据表做左连接,这样空日期也能保留。下面给你分几种常用数据库的具体实现方案:

解决方案

1. MySQL 版本(8.0+ 支持递归CTE)

MySQL没有自带的日期序列生成函数,用递归CTE是最简洁的方式:

WITH RECURSIVE date_range AS (
    -- 先拿到当前月份的第一天
    SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01') AS created_on
    UNION ALL
    -- 每天加1天,直到当月最后一天
    SELECT DATE_ADD(created_on, INTERVAL 1 DAY)
    FROM date_range
    WHERE created_on < LAST_DAY(CURDATE())
)
SELECT dr.created_on, COALESCE(t.name, '无记录') AS name -- 把NULL替换成你想要的默认值
FROM date_range dr
LEFT JOIN your_table t ON dr.created_on = DATE(t.created_date) -- 注意把datetime转成date匹配
ORDER BY dr.created_on;

提示:如果你的MySQL版本低于8.0,没法用递归CTE,可以建一个包含0-31的数字表,再通过日期计算生成当月所有日期。

2. PostgreSQL 版本

PostgreSQL的generate_series函数天生适合干这个,写法超简洁:

SELECT 
    dr.created_on,
    COALESCE(t.name, '无记录') AS name
FROM generate_series(
    -- 生成当月第一天到最后一天的日期序列
    date_trunc('month', CURRENT_DATE)::date,
    (date_trunc('month', CURRENT_DATE) + interval '1 month' - interval '1 day')::date,
    interval '1 day'
) dr(created_on)
LEFT JOIN your_table t ON dr.created_on = t.created_date::date
ORDER BY dr.created_on;

3. SQL Server 版本

用递归CTE配合EOMONTH函数就能搞定:

WITH date_range AS (
    -- 获取当月第一天
    SELECT DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) AS created_on
    UNION ALL
    -- 逐天递增,直到当月最后一天
    SELECT DATEADD(DAY, 1, created_on)
    FROM date_range
    WHERE created_on < EOMONTH(GETDATE())
)
SELECT dr.created_on, COALESCE(t.name, '无记录') AS name
FROM date_range dr
LEFT JOIN your_table t ON dr.created_on = CAST(t.created_date AS DATE)
ORDER BY dr.created_on
OPTION (MAXRECURSION 31); -- 限制递归次数,一个月最多31天足够用

关键注意事项

  • 记得把代码里的your_table替换成你实际的数据表名
  • 如果created_date是带时分秒的datetime类型,一定要转成date类型再匹配,不然会因为时间部分不匹配导致漏数据
  • COALESCE函数是用来把空值替换成你想要的内容,比如'无记录',如果不需要可以直接写t.name,空的时候会显示NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:58