2025年09月08日/ 浏览 4
在数据处理中,我们常会遇到两种时间戳:
– 10位时间戳:表示从1970年1月1日(UTC)开始的秒数
– 13位时间戳:精确到毫秒级,前10位代表秒,后3位为毫秒(如JavaScript默认生成的时间戳)
FROM_UNIXTIME()
函数MySQL原生支持通过FROM_UNIXTIME()
将Unix时间戳转为日期,但该函数默认仅支持10位时间戳。对于13位时间戳需先做除法处理:
sql
SELECT FROM_UNIXTIME(1633046400123 / 1000) AS datetime;
结果:2021-10-01 00:00:00
若需要保留毫秒,可使用DATE_FORMAT
组合:
sql
SELECT
CONCAT(
FROM_UNIXTIME(1633046400123 / 1000),
'.',
LPAD(MOD(1633046400123, 1000), 3, '0')
) AS full_datetime;
结果:2021-10-01 00:00:00.123
sql
-- 判断是否为13位时间戳
SELECT LENGTH(CAST(1633046400123 AS CHAR)) AS timestamp_length;
sql
SELECT
1633046400123 AS origin_timestamp,
FROM_UNIXTIME(1633046400123 / 1000) AS standard_datetime;
使用DATE_FORMAT
指定输出格式:
sql
SELECT
DATE_FORMAT(
FROM_UNIXTIME(1633046400123 / 1000),
'%Y-%m-%d %H:%i:%s'
) AS formatted_date;
MySQL默认使用系统时区,可通过CONVERT_TZ
函数调整:
sql
SET time_zone = '+00:00'; -- 设置为UTC时区
SELECT
FROM_UNIXTIME(1633046400123 / 1000) AS utc_time,
CONVERT_TZ(
FROM_UNIXTIME(1633046400123 / 1000),
'+00:00',
'+08:00'
) AS beijing_time;
sql
UPDATE user_logs
SET create_date = FROM_UNIXTIME(timestamp_col / 1000)
WHERE timestamp_col > 1000000000000;
sql
-- 查询2023年的数据(13位时间戳范围)
SELECT * FROM orders
WHERE timestamp_col BETWEEN 1672531200000 AND 1704067199000;
php
// PHP生成13位时间戳存入MySQL
$timestamp = round(microtime(true) * 1000);
$sql = "INSERT INTO events (ts, content) VALUES ($timestamp, 'test')";
FROM_UNIXTIME()
有效范围为1970-2038年BIGINT
最大值时需用字符串存储时间戳通过以上方法,你可以轻松处理各种时间戳转换需求。建议在数据库设计阶段就明确时间存储格式,避免后期复杂的转换操作。