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
相关产品推荐
相关产品推荐

