from_unixtime是将unix时间戳(秒级整数)转换为日期时间字符串的mysql函数,默认返回'yyyy-mm-dd hh:mm:ss'格式的字符串,类型为datetime;支持可选格式化参数和时区依赖,毫秒级时间戳需先除以1000。

FROM_UNIXTIME函数的基本用法和返回类型
FROM_UNIXTIME 是 MySQL 中将 Unix 时间戳(秒级整数)转为日期时间字符串的核心函数。它默认返回 DATETIME 类型的字符串,格式为 'YYYY-MM-DD HH:MM:SS',不是真正的 DATETIME 值,但可直接参与比较或插入到 DATETIME 字段中。
- 传入合法时间戳(如
1717027200)会得到类似'2024-05-31 00:00:00'的结果 - 传入
NULL或非法数值(如负数超出范围、非数字)返回NULL - 不指定时区时,按 MySQL 服务器当前时区解释时间戳(不是 UTC)
- 若需毫秒级时间戳(13 位),必须先除以 1000 并
FLOOR或CAST,否则会被截断为秒
如何用格式化字符串控制输出样式
第二个参数是格式化模板,用 % 占位符控制输出。它和 DATE_FORMAT 共享同一套语法,但不能省略引号。
- 常用组合:
FROM_UNIXTIME(1717027200, '%Y-%m-%d')→'2024-05-31' - 中文星期:
FROM_UNIXTIME(1717027200, '%W, %M %D, %Y')→'Friday, May 31st, 2024'(注意:%W依赖系统 lc_time_names 设置) - 只取小时分钟:
FROM_UNIXTIME(1717027200, '%H:%i')→'00:00' - 错误写法:
FROM_UNIXTIME(1717027200, %Y)缺少引号,会报错ERROR 1064
时区问题导致的结果偏差
Unix 时间戳本身是时区无关的,但 FROM_UNIXTIME 默认按服务器时区转换。如果数据是 UTC 时间戳,而你的 MySQL 时区设为 SYSTEM(如 CST),结果就会偏移 8 小时。
- 查当前时区:
SELECT @@time_zone; - 临时切换(会话级):
SET time_zone = '+00:00';,再执行FROM_UNIXTIME - 更稳妥的做法:用
CONVERT_TZ配合,例如CONVERT_TZ(FROM_UNIXTIME(ts), '+00:00', 'Asia/Shanghai') - 建表时建议存储时间戳为
INT UNSIGNED,并在应用层或查询时统一处理时区,避免数据库层隐式转换
性能与索引注意事项
在 WHERE 子句中对字段使用 FROM_UNIXTIME 会导致全表扫描,因为无法走索引。
- 错误示例:
WHERE FROM_UNIXTIME(created_at) > '2024-01-01'——created_at是 INT 类型时间戳字段 - 正确写法:把条件转成时间戳比较,
WHERE created_at > UNIX_TIMESTAMP('2024-01-01') -
UNIX_TIMESTAMP和FROM_UNIXTIME不是严格互逆:前者接受DATETIME字符串并转为本地时区对应的时间戳;后者按当前时区解释该时间戳 - 批量转换上万行时,建议加
SELECT ... INTO OUTFILE或分批次处理,避免长事务锁表











