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

MySQL按月统计数据方法及错误查询语句修正请求

修正按月统计MySQL数据的查询语句

嘿,作为MySQL新手能自己摸索写统计语句已经超棒啦!我帮你梳理下原语句里的问题,然后给出更准确的写法~

原语句里的两个问题

  • 拼写错误:第二个SUM里的YAER_MONTH是笔误,应该是YEAR_MONTH
  • 日期比较逻辑漏洞:EXTRACT(YEAR_MONTH FROM ...)返回的是类似202405的数字,而cr_dt如果是DATE或DATETIME类型,直接和数字比较会触发隐式转换,容易出现不准确的结果;而且你的范围判断没包含当月第一天的0点,还会漏掉当月最后一天23:59:59的记录。

推荐的修正写法(两种方案)

方案1:精准日期范围判断(推荐,支持索引)

这种写法直接用日期区间做判断,能利用cr_dt字段的索引,查询效率更高,而且边界处理更准确:

SELECT
    -- 统计当月数据:从当月第一天0点到下个月第一天0点(不包含下个月第一天)
    SUM(cr_dt >= DATE_FORMAT(CURDATE(), '%Y-%m-01 00:00:00') 
        AND cr_dt < DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')) AS thisMonth,
    -- 统计上月数据:从上月第一天0点到当月第一天0点(不包含当月第一天)
    SUM(cr_dt >= DATE_FORMAT(CURDATE() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00') 
        AND cr_dt < DATE_FORMAT(CURDATE(), '%Y-%m-01 00:00:00')) AS last1Month
FROM MYTABLE;

方案2:年月字符串匹配(简洁,适合无时间的DATE类型)

如果你的cr_dt是不带时间的DATE类型,也可以用这种更简洁的写法,但注意:因为对cr_dt用了函数处理,会导致索引失效,数据量大时不推荐:

SELECT
    SUM(DATE_FORMAT(cr_dt, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m')) AS thisMonth,
    SUM(DATE_FORMAT(cr_dt, '%Y%m') = DATE_FORMAT(CURDATE() - INTERVAL 1 MONTH, '%Y%m')) AS last1Month
FROM MYTABLE;

小提示

如果你的表数据量比较大,优先用方案1,确保cr_dt字段有索引的话,查询速度会快很多哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:59:21