我们可以使用date_format()函数格式化时间,然后进行分组操作
例如有一个学生表,结构如下
| id | name | age | height | gender | create_time |
|---|---|---|---|---|---|
| 1 | pan | 27 | 169 | 1 | 2022-01-13 10:20:22 |
| 2 | yang | 18 | 177 | 1 | 2022-03-14 09:16:42 |
| 3 | daisy | 25 | 156 | 2 | 2022-07-19 19:58:03 |
-- 按年 select date_format(create_time, '%Y') years,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by years; -- 按月 select date_format(create_time, '%Y-%m') months,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by months; -- 按周 select date_format(create_time, '%Y-%u') weeks,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by weeks; -- 按日 select date_format(create_time, '%Y-%m-%d') days,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by days;
如果不想用date_format函数,可以使用对应的year()/month()/week()/day()函数替代
2.占位符date_format()需要传入一个特定的占位符,mysql常用的占位符可参考下表
| 占位符 | 说明 |
|---|---|
| %Y | 年(4位) |
| %y | 年(2位) |
| %M | 月(英文名,如January) |
| %m | 月(数字,如01) |
| %D | 日(英文名,如1st) |
| %d | 日(数字,如01) |
| %e | 日(数字,如1) |
| %U | 一年中的第几周,从0开始 ,周日是第一天 |
| %u | 一年中的第几周,从0开始,周一是第一天 |
| %H | 时,24小时制,例如15 |
| %h | 时,12小时制,例如01 |
| %i | 分 |
| %s | 秒 |



