MySQL中时间戳INT字段按天分组应使用FROM_UNIXTIME(created_at, '%Y-%m-%d')或DATE(FROM_UNIXTIME(created_at));按周分组推荐YEARWEEK(FROM_UNIXTIME(created_at), 1);PHP补零需预生成日期数组并覆盖,避免in_array低效判断;时间戳分桶宜用floor($ts/300)*300或DateTime对齐;三端时区与边界必须严格统一。

直接在 SQL 里用 DATE() 或 FROM_UNIXTIME() 处理时间戳分组,比 PHP 循环解析快得多,也更可靠。PHP 层只该做补零、对齐、格式转换这类收尾工作。
MySQL 中时间戳字段怎么按天分组
如果数据库字段是 INT(10) 存的 Unix 时间戳(比如 created_at),不能直接 GROUP BY created_at——那会按秒分组。必须先转成日期粒度:
-
FROM_UNIXTIME(created_at, '%Y-%m-%d')最常用,语义清晰,但 MySQL 5.7+ 才支持索引下推优化 -
DATE(FROM_UNIXTIME(created_at))兼容性更好,老版本也稳,但多一层函数调用 - 别用
date_format(from_unixtime(created_at), '%Y-%m-%d')—— 冗余且易错 - 查询示例:
SELECT FROM_UNIXTIME(created_at, '%Y-%m-%d') AS day, COUNT(*) FROM logs WHERE created_at >= 1747814400 GROUP BY day
按周分组时 YEARWEEK() 和 WEEK() 的区别
WEEK(created_at) 返回的是当年第几周(0–53),但默认以周日为起点,跨年时容易把 12 月最后几天算进下一年的第 0 周;YEARWEEK(created_at, 1) 才是安全选择:
-
YEARWEEK(created_at, 1):周一为每周起点,返回形如202620(2026 年第 20 周),ISO 标准,跨年无歧义 -
WHERE YEARWEEK(created_at, 1) = YEARWEEK(NOW(), 1)可准确查“本周”,不依赖当前星期几 - 注意:
YEARWEEK()返回值是整数,不是字符串,别加引号 - 如果字段是时间戳,记得先转:
YEARWEEK(FROM_UNIXTIME(created_at), 1)
PHP 补全空日期时别用 in_array 判断
图表要求连续 7 天横轴,但数据库只返回有数据的日期(比如只有周一、三、五)。常见错误是在 PHP 循环里用 in_array($date, $db_dates) 判断再插 0 —— 效率低、逻辑绕、易漏边界。
立即学习“PHP免费学习笔记(深入)”;
- 正确做法:先用
array_fill_keys($date_list, 0)初始化全零数组,再用foreach ($rows as $row) { $result[$row['day']] = $row['count']; }覆盖真实值 -
$date_list推荐用array_map(fn($i) => date('Y-m-d', strtotime("2026-05-15 + $i day")), range(0, 6))预生成 - 关键点:
$result必须是顺序索引数组(非关联),否则json_encode()后前端拿到的 labels/data 顺序可能错乱 - 补零必须在 PHP 层完成,不能甩给前端 JS 拼接——异步加载时缺 key 会导致图表坐标偏移
时间戳分桶(如每 5 分钟)要防浮点误差
按固定间隔聚合(比如实时监控每 5 分钟请求数),直接用 intval($ts / 300) * 300 看似简单,但遇上夏令时切换或高并发时间戳重复时,可能因浮点截断导致同一秒内两个时间戳落到不同桶。
- 更稳妥的做法是用
DateTime对齐:$dt = new DateTime("@$ts"); $dt->modify('floor 5 minutes'); $bucket = $dt->getTimestamp(); - 或者改用整除加 floor:
floor($ts / 300) * 300,比intval()更严格 - 生成标签时,统一用
date('H:i', $bucket)和date('H:i', $bucket + 300),避免手动拼接出错 - 若涉及跨天(比如统计凌晨时段),标签里必须含日期:
date('Y-m-d H:i', $bucket)
真正难的不是写对一行 GROUP BY,而是保证从数据库取值、PHP 补零、前端渲染三端的时间解释完全一致——时区、起止边界、ISO 周定义,任何一个没对齐,图表就悄悄错位。



















