sql按天统计的核心是将时间字段截取为日期粒度后分组:mysql用date()、postgresql用::date或date_trunc('day',...)、sql server用cast(... as date)、oracle用trunc(),均配合group by和聚合函数实现。

SQL按天统计,核心是把时间字段截取到“日期”粒度再分组。不同数据库的日期函数略有差异,但思路一致:先转换时间字段为纯日期(去掉时分秒),再用 GROUP BY 按该日期分组,最后配合 COUNT、SUM 等聚合函数统计。
MySQL:用 DATE() 函数提取日期
MySQL 最常用也最直观的方式是用 DATE() 函数:
SELECT DATE(create_time) AS stat_date, COUNT(*) AS cnt FROM orders WHERE create_time >= '2024-01-01' GROUP BY DATE(create_time) ORDER BY stat_date;
说明:DATE(create_time) 会把 '2024-01-01 14:23:05' 转成 '2024-01-01',适合直接分组。注意 WHERE 条件建议加时间范围,避免全表扫描。
PostgreSQL:用 ::date 或 date_trunc()
PostgreSQL 支持类型强制转换,更推荐用 ::date(简洁)或 date_trunc('day', ...)(更灵活,便于后续扩展到小时/月):
- 简洁写法:
SELECT create_time::date AS stat_date, COUNT(*) AS cnt FROM orders WHERE create_time >= '2024-01-01' GROUP BY create_time::date ORDER BY stat_date;
- 若需兼容更高精度(比如后续想按小时查),可用:
GROUP BY date_trunc('day', create_time)
SQL Server:用 CAST 或 CONVERT 转日期
SQL Server 不支持直接 DATE() 提取(旧版本),推荐用 CAST(... AS DATE)(SQL Server 2008+):
SELECT CAST(create_time AS DATE) AS stat_date, COUNT(*) AS cnt FROM orders WHERE create_time >= '2024-01-01' GROUP BY CAST(create_time AS DATE) ORDER BY stat_date;
说明:CAST 比 CONVERT 更简洁;如果用 CONVERT,格式码 23(ISO 标准日期)也可实现,但 CAST 更易读。
Oracle:用 TRUNC() 截断时间部分
Oracle 中 TRUNC(datetime_col) 默认按天截断(去掉时分秒),是最自然的写法:
SELECT TRUNC(create_time) AS stat_date, COUNT(*) AS cnt FROM orders WHERE create_time >= DATE '2024-01-01' GROUP BY TRUNC(create_time) ORDER BY stat_date;
注意:WHERE 中用 DATE '2024-01-01' 可避免隐式类型转换;TRUNC 也支持指定单位,如 TRUNC(create_time, 'HH24') 按小时截断。










