MySQL日期格式化教程 13位时间戳转日期类型的解决方案

MySQL日期格式化教程 13位时间戳转日期类型的解决方案
最新回答
指尖星光在流浪

2021-04-23 03:07:47

MySQL中13位毫秒时间戳转换为日期类型的核心方法是先将其除以1000转换为秒级时间戳,再使用FROM_UNIXTIME()函数处理,若需自定义格式可结合DATE_FORMAT()函数。 以下是具体解决方案及扩展说明:

一、13位时间戳转日期格式
  1. 基础转换(标准日期时间格式)将毫秒时间戳除以1000后,用FROM_UNIXTIME()转换为YYYY-MM-DD HH:MM:SS格式:

    SELECT FROM_UNIXTIME(timestamp_ms / 1000) AS converted_datetime FROM my_data;
  2. 自定义日期格式通过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;
  3. 保留毫秒信息(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;
二、日期类型反向转13位时间戳
  1. 基础转换(秒级转毫秒)用UNIX_TIMESTAMP()获取秒级时间戳后乘以1000:

    SELECT event_time, UNIX_TIMESTAMP(event_time) * 1000 AS timestamp_milliseconds_approxFROM my_events;
  2. 精确转换(支持微秒的版本)若DATETIME/TIMESTAMP字段存储微秒精度(如DATETIME(3)),需分离秒和毫秒部分:

    SELECT event_time, FLOOR(UNIX_TIMESTAMP(event_time)) * 1000 + FLOOR(MICROSECOND(event_time) / 1000) AS precise_timestamp_msFROM my_events;
  3. 获取当前时间的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;

三、关键注意事项
  1. 时区问题

    NOW()返回服务器时区时间,UTC_TIMESTAMP()返回UTC时间。

    建议统一存储UTC时间,应用层按用户时区展示,避免跨地域数据偏差。

    使用CONVERT_TZ()转换时区时需确保时区表已加载。

  2. 数据类型选择

    DATETIME:范围广(1000-01-01至9999-12-31),无时区信息,适合存储固定时间点。

    TIMESTAMP:范围较小(1970-01-01至2038-01-19 UTC),受时区影响,适合需要自动转换的场景。

  3. 版本兼容性

    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中毫秒时间戳与日期类型的双向转换,同时规避时区、数据类型等常见陷阱。