13位时间戳是毫秒级Unix时间戳,需除以1000转为秒级再用FROM_UNIXTIME()转换为日期,结合DATE_FORMAT()可自定义格式,注意数据类型、NULL值、时区及索引性能问题。

在MySQL中处理13位时间戳(通常是毫秒级)并将其转换为可读的日期格式,核心思路其实很简单:你需要先将这个毫秒级时间戳转换为秒级,然后再使用MySQL内置的
FROM_UNIXTIME()
要将一个存储为13位(毫秒)的时间戳字段(假设名为
timestamp_ms
BIGINT
SELECT
FROM_UNIXTIME(timestamp_ms / 1000) AS converted_datetime
FROM
your_table_name;如果你需要更精细的日期时间格式控制,可以结合
DATE_FORMAT()
SELECT
DATE_FORMAT(FROM_UNIXTIME(timestamp_ms / 1000), '%Y-%m-%d %H:%i:%s') AS formatted_datetime
FROM
your_table_name;这基本上就是解决问题的关键。我个人在处理来自各种系统(比如前端JavaScript的
Date.now()
System.currentTimeMillis()
FROM_UNIXTIME
这个问题问得好,这其实是很多开发者初次遇到时会有的疑问。简单来说,时间戳的位数差异反映了其精度。
我们常说的“Unix时间戳”或者“Epoch时间”通常是指从1970年1月1日00:00:00 UTC(协调世界时)开始经过的秒数,这是一个10位的整数。这是最传统、最广泛使用的Unix时间戳格式。
然而,在现代应用开发中,尤其是在需要更高时间精度或者跨语言、跨平台数据交换的场景下,毫秒级时间戳变得非常流行。例如:
Date.now()
1678886400000
System.currentTimeMillis()
所以,当你在MySQL数据库中看到13位时间戳时,几乎可以肯定它代表的是毫秒级的Unix时间戳。这并不是什么“错误”,而是一种更高精度的时间表示方式。我曾经手头的一个项目,后端是Java,前端是React,数据传递过程中就自然而然地使用了毫秒时间戳,存入数据库时也原样保留,直到需要报表展示时才进行转换。
将13位时间戳转换为特定日期格式,我们主要依赖
FROM_UNIXTIME()
DATE_FORMAT()
FROM_UNIXTIME()
DATETIME
TIMESTAMP
DATE_FORMAT()
正如前面提到的,关键在于先将13位毫秒时间戳除以1000,得到10位秒级时间戳。然后,你可以使用
DATE_FORMAT()
-- 假设你的13位时间戳字段是 event_timestamp_ms
SELECT
DATE_FORMAT(FROM_UNIXTIME(event_timestamp_ms / 1000), '%Y-%m-%d %H:%i:%s') AS "精确到秒",
DATE_FORMAT(FROM_UNIXTIME(event_timestamp_ms / 1000), '%Y年%m月%d日 %H时%i分%s秒') AS "中文格式",
DATE_FORMAT(FROM_UNIXTIME(event_timestamp_ms / 1000), '%W, %M %D, %Y %r') AS "英文口语化格式",
DATE_FORMAT(FROM_UNIXTIME(event_timestamp_ms / 1000), '%Y%m%d%H%i%s') AS "无分隔符格式"
FROM
your_log_table;这里列举了一些常用的格式化符号:
%Y
%m
%d
%H
%i
%s
%f
FROM_UNIXTIME
DATETIME(N)
%W
%m
%d
%r
选择合适的格式化符号组合,就能满足绝大多数的日期时间显示需求。
尽管转换看起来简单,但在实际应用中,还是有一些“坑”需要留意,以及一些优化建议可以考虑。
可能遇到的坑:
VARCHAR
/ 1000
BIGINT
VARCHAR
CAST(timestamp_str AS UNSIGNED)
CONVERT(timestamp_str, UNSIGNED)
NULL
FROM_UNIXTIME(NULL)
NULL
NULL
IFNULL()
COALESCE()
FROM_UNIXTIME()
NULL
FROM_UNIXTIME()
优化建议:
WHERE DATE_FORMAT(FROM_UNIXTIME(timestamp_ms / 1000), '%Y-%m-%d') = '2023-03-15'
timestamp_ms
DATETIME
WHERE timestamp_ms BETWEEN UNIX_TIMESTAMP('2023-03-15 00:00:00') * 1000 AND UNIX_TIMESTAMP('2023-03-15 23:59:59') * 1000timestamp_ms
-- 创建一个视图,包含转换后的日期时间
CREATE VIEW your_table_with_datetime_view AS
SELECT
*, -- 包含所有原始字段
DATE_FORMAT(FROM_UNIXTIME(timestamp_ms / 1000), '%Y-%m-%d %H:%i:%s') AS formatted_datetime
FROM
your_table_name;
-- 查询视图
SELECT * FROM your_table_with_datetime_view WHERE formatted_datetime LIKE '2023-03%';请注意,虽然视图可以简化查询,但其底层仍然是执行函数转换,因此对大量数据的过滤查询性能影响与直接使用函数相同。所以,索引优化方案通常是更根本的解决之道。
以上就是MySQL时间戳转换技巧 详解13位时间戳转日期格式的实现方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号