问题描述
在MySQL数据库中,如何统计一段时间内以某个字段分组的年/月总数。假如有一个TIMESTAMP类型的字段record_date,和MySQL查询的伪代码,如下:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
或者,按照年/月进行分组统计的伪代码,如下:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
在MySQL数据库中,如何实现以上伪代码的按年,月的分组统计呢?
方案一SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY YEAR(record_date), MONTH(record_date)
方案二
使用MySQL的DATE_FORMAT函数,如下:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY DATE_FORMAT(record_date, '%Y%m')
方案三
使用MySQL的EXTRACT函数,如下:
SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)
方案四
如果你的MySQL数据库中的数据已经很多了,那么建议:
版本一:
SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')
或者
版本二:
SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)相比之下,版本二的性能更好,查询速度更快。
方案五
使用MySQL的DAYOFMONTH函数,如下:
SELECT COUNT(id)
FROM stats
GROUP BY DAYOFMONTH(record_date)