SELECT date(create_time AT TIME ZONE 'Asia/Shanghai') AS d, sum(amount) FROM orders WHERE create_time >= '2026-02-28 16:00:00+00' AND create_time < '2026-03-01 16:00:00+00' GROUP BY 1;
运营发现 3 月 1 日的日报比明细多出 12 笔,订单时间都在 00:00 到 00:10 之间,金额合计 4860 元。明细页按本地时间展示,看着完全正常。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:统计 SQL 取当天零点到次日零点,零点用的是服务器本地时区,数据库里存的却是 UTC。两边差八小时,边界整体前移,凌晨那一段就落进了前一天。
「统计日切」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。监控和日志的时间要对上,时区不一致会多绕很大一圈。
处理上按这个顺序:统计前统一时区 查询参数按业务时区生成再转成存储时区;边界写成左闭右开的半开区间 避免零点那一笔重复计入;报表加总金额校验 和明细求和比对;换时区或换库时先跑一遍零点附近的样例数据。
确认没问题再收工,重跑 3 月 1 日的日报 总额和明细求和一致 零点那 12 笔回到当天。
