2021-04-23 03:07:47
MySQL中13位毫秒时间戳转换为日期类型的核心方法是先将其除以1000转换为秒级时间戳,再使用FROM_UNIXTIME()函数处理,若需自定义格式可结合DATE_FORMAT()函数。 以下是具体解决方案及扩展说明:
一、13位时间戳转日期格式基础转换(标准日期时间格式)将毫秒时间戳除以1000后,用FROM_UNIXTIME()转换为YYYY-MM-DD HH:MM:SS格式:
SELECT FROM_UNIXTIME(timestamp_ms / 1000) AS converted_datetime FROM my_data;自定义日期格式通过DATE_FORMAT()指定输出格式,例如仅显示日期或精确到秒:
-- 仅显示日期(YYYY-MM-DD)SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp_ms / 1000), '%Y-%m-%d') AS converted_date FROM my_data;-- 精确到秒(YYYY-MM-DD HH:MM:SS)SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp_ms / 1000), '%Y-%m-%d %H:%i:%s') AS formatted_datetime FROM my_data;保留毫秒信息(MySQL 5.6.4+)若需展示毫秒且MySQL版本支持微秒精度,可通过MOD和LPAD拼接毫秒部分:
SELECT CONCAT( DATE_FORMAT(FROM_UNIXTIME(timestamp_ms / 1000), '%Y-%m-%d %H:%i:%s'), '.', LPAD(MOD(timestamp_ms, 1000), 3, '0')) AS datetime_with_ms_string FROM my_data;基础转换(秒级转毫秒)用UNIX_TIMESTAMP()获取秒级时间戳后乘以1000:
SELECT event_time, UNIX_TIMESTAMP(event_time) * 1000 AS timestamp_milliseconds_approxFROM my_events;精确转换(支持微秒的版本)若DATETIME/TIMESTAMP字段存储微秒精度(如DATETIME(3)),需分离秒和毫秒部分:
SELECT event_time, FLOOR(UNIX_TIMESTAMP(event_time)) * 1000 + FLOOR(MICROSECOND(event_time) / 1000) AS precise_timestamp_msFROM my_events;获取当前时间的13位时间戳
MySQL 8.0.17+:直接使用UNIX_TIMESTAMP(NOW(3)) * 1000。
兼容旧版本:手动拼接秒和毫秒部分:SELECT FLOOR(UNIX_TIMESTAMP(NOW())) * 1000 + FLOOR(MICROSECOND(NOW()) / 1000) AS current_timestamp_ms_manual;
时区问题
NOW()返回服务器时区时间,UTC_TIMESTAMP()返回UTC时间。
建议统一存储UTC时间,应用层按用户时区展示,避免跨地域数据偏差。
使用CONVERT_TZ()转换时区时需确保时区表已加载。
数据类型选择
DATETIME:范围广(1000-01-01至9999-12-31),无时区信息,适合存储固定时间点。
TIMESTAMP:范围较小(1970-01-01至2038-01-19 UTC),受时区影响,适合需要自动转换的场景。
版本兼容性
MySQL 5.6.4前不支持微秒精度,UNIX_TIMESTAMP()仅返回秒级结果。
若需毫秒精度,需确保使用支持微秒的版本(如5.6.4+)并定义字段为DATETIME(3)或DATETIME(6)。
为什么时间戳是13位?10位时间戳为秒级(Unix标准),13位为毫秒级,常见于JavaScript(Date.now())和Java(System.currentTimeMillis())等系统。
MySQL为何需要除以1000?MySQL内置函数(如FROM_UNIXTIME())默认处理秒级时间戳,而13位时间戳精度更高,需手动调整。
通过上述方法,可高效完成MySQL中毫秒时间戳与日期类型的双向转换,同时规避时区、数据类型等常见陷阱。