11 月 13 日早上 7 点提交的问卷,报表里算在 11 月 12 日,日报每天少 8 小时的样本,晚上 8 点后又多出一截。乍看像缓存或者权限的锅,追下去往往不是。
SELECT DATE(CONVERT_TZ(created_at, '+00:00', '+08:00')) d, COUNT(*) FROM wp_survey_response GROUP BY d;
追下去是这么回事:数据库存的是 UTC 时间,统计 SQL 直接用 DATE(created_at),没有转成站点时区。前端展示又按本地时间格式化了一次。
碰到「问卷时间时区」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
同一份配置存在多处的,先确认改的是被加载的那一份。
具体做法是,统一存 UTC,查询时用 CONVERT_TZ 转成加八区;或者存 timestamp 并在应用层按站点时区格式化;用早上 7 点和晚上 11 点各提交一份核对日期。
验收就看一点,早上 7 点提交的算在当天,晚上 11 点的也在当天,日报总数和提交量一致。
