2025年09月08日/ 浏览 5
关键词:MySQL时间戳转换、13位转日期、UNIX时间戳处理、日期格式化
描述:本文详细介绍MySQL中13位时间戳与标准日期格式相互转换的5种方法,包括函数处理、时区校准和性能优化方案,适用于Java/PHP等语言生成的时间戳场景。
在开发中,我们常见到像1625068800000
这样的13位时间戳,这其实是包含毫秒的UNIX时间戳。与传统的10位时间戳(秒级)不同,MySQL的日期函数默认不支持这种格式,需要特殊处理。
sql
SELECT FROM_UNIXTIME(1625068800000 / 1000);
-- 输出:2021-06-30 16:00:00
原理:将13位时间戳除以1000转换为秒级时间戳
sql
SELECT DATE_ADD('1970-01-01', INTERVAL 1625068800000/1000 SECOND);
sql
SELECT FROM_UNIXTIME(1625068800.123); -- 保留3位小数代表毫秒
当转换结果与预期相差8小时:sql
— 方法1:设置会话时区
SET time_zone = ‘+08:00’;
— 方法2:使用时区转换函数
SELECT CONVERTTZ(FROMUNIXTIME(ts/1000), ‘UTC’, ‘Asia/Shanghai’);
sql
SELECT UNIX_TIMESTAMP('2021-06-30 16:00:00') * 1000;
-- 输出:1625068800000
存储建议:
TIMESTAMP
或DATETIME
类型存储日期索引优化:
sql
-- 在毫秒时间戳列上创建索引
ALTER TABLE events ADD INDEX idx_ts (timestamp_column);
批量转换技巧:
sql
UPDATE user_logs
SET create_time = FROM_UNIXTIME(log_time/1000)
WHERE log_time > 0;
数值溢出错误:
SELECT FROM_UNIXTIME(253402300799000);
格式异常处理:
sql
-- 使用IFNULL防止空值报错
SELECT IFNULL(FROM_UNIXTIME(NULLIF(ts,0)/1000), '1970-01-01')
FROM sensor_data;
| 语言 | 生成代码示例 |
|————|———————————-|
| Java | System.currentTimeMillis()
|
| JavaScript | Date.now()
|
| PHP | round(microtime(true)*1000)
|
| Python | int(time.time()*1000)
|