MySQL使用epoch时间戳查询data_stats表当日更新记录的方法
问题排查与解决方法
核心原因
你执行的查询返回空的绝大多数原因是:updated_at字段存储的是13位毫秒级Unix时间戳,而FROM_UNIXTIME函数默认仅支持传入10位秒级时间戳,直接传入毫秒值会得到超出当前日期的错误结果,自然匹配不到记录。
验证方法
可以先执行以下语句确认时间戳精度:
-- 取一条记录的时间戳做转换测试 SELECT FROM_UNIXTIME(updated_at) AS test_time FROM `data_stats` LIMIT 1;
如果返回的test_time为NULL或者明显是远超当前的未来日期,就说明是毫秒级时间戳。
正确写法
写法1:字段函数转换(仅适配小表,无法走索引)
如果是毫秒级时间戳,只需要把字段值先除以1000转为秒级即可:
SELECT * FROM `data_stats` WHERE FROM_UNIXTIME(updated_at/1000,"%Y-%m-%d") = CURRENT_DATE;
写法2:时间戳范围匹配(推荐,可走updated_at索引,大表性能好)
避免对查询字段做函数运算,直接计算当日的时间戳范围做匹配:
秒级时间戳场景
SELECT * FROM `data_stats` WHERE updated_at >= UNIX_TIMESTAMP(CURRENT_DATE) AND updated_at < UNIX_TIMESTAMP(DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY));
毫秒级时间戳场景
SELECT * FROM `data_stats` WHERE updated_at >= UNIX_TIMESTAMP(CURRENT_DATE) * 1000 AND updated_at < UNIX_TIMESTAMP(DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY)) * 1000;
内容的提问来源于stack exchange,提问作者Gol. D Roger
相关产品推荐
相关产品推荐

