<p>要将mysql中的13位时间戳转换为日期,必须先将其除以1000转换为10位秒级时间戳,再使用from_unixtime函数进行转换,因为mysql的from_unixtime函数仅接受秒级时间戳;直接使用13位时间戳会导致转换错误或超出范围,正确做法是执行select from_unixtime(timestamp_ms / 1000) as converted_datetime from your_table;若需格式化输出,可使用select from_unixtime(timestamp_ms / 1000, '%y-%m-%d %h:%i:%s') as formatted_datetime from your_table;在查询性能优化方面,应避免在where子句中对时间戳字段使用函数,而应将日期范围转换为13位时间戳后直接比较,以利用索引提升查询效率,例如通过set @start_ts_ms = unix_timestamp('2023-03-15 00:00:00') * 1000计算起始时间戳,并在查询中使用where timestamp_ms >= @start_ts_ms and timestamp_ms <= @end_ts_ms来确保索引有效使用;此外,根据业务需求选择bigint存储毫秒级时间戳或datetime存储标准日期时间类型,可平衡存储效率与查询便利性,最终方案应结合数据来源、查询模式和性能要求综合决策。</p>

要将MySQL中的13位时间戳转换为日期,核心在于理解MySQL的
FROM_UNIXTIME
我们经常会遇到从前端或者其他系统(比如Java的
System.currentTimeMillis()
FROM_UNIXTIME()
所以,最直接、最有效的方法就是在使用
FROM_UNIXTIME()
假设你的表名是
your_table
timestamp_ms
BIGINT
SELECT
FROM_UNIXTIME(timestamp_ms / 1000) AS converted_datetime
FROM
your_table;如果你需要特定的日期时间格式,比如只显示年月日时分秒,可以给
FROM_UNIXTIME
SELECT
FROM_UNIXTIME(timestamp_ms / 1000, '%Y-%m-%d %H:%i:%s') AS formatted_datetime
FROM
your_table;这个方法简单粗暴,但确实是最符合MySQL原生函数设计逻辑的。我个人在处理这类跨系统时间戳问题时,几乎都是第一时间想到这个办法,因为它既直观又高效。
这其实是个很常见的“坑”,尤其是当你从一个Java或者JavaScript背景转到MySQL,或者反之。核心原因在于,不同系统对“时间戳”这个概念的默认精度定义不同。
我们常说的Unix时间戳,它的标准定义是从1970年1月1日00:00:00 UTC到现在的秒数。所以,它是一个10位的整数(比如
1678886400
FROM_UNIXTIME()
然而,在很多现代编程语言和系统中,为了更高的精度,时间戳被扩展到了毫秒级。比如Java的
System.currentTimeMillis()
Date.now()
1678886400000
所以,当你尝试直接把一个13位的毫秒级时间戳扔给
FROM_UNIXTIME()
理解这个精度差异是解决问题的关键。它不是MySQL的“bug”,而是不同系统之间对“时间戳”这一概念的约定不同。
虽然
FROM_UNIXTIME
UNIX_TIMESTAMP()
FROM_UNIXTIME()
DATETIME
TIMESTAMP
SELECT UNIX_TIMESTAMP(NOW()) AS current_unix_timestamp;
如果你需要13位毫秒级时间戳,MySQL本身没有直接提供,通常需要应用程序层进行拼接(
UNIX_TIMESTAMP() * 1000
DATE_FORMAT()
DATETIME
DATE
TIMESTAMP
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒') AS formatted_chinese_date;
它不能直接将数字时间戳转换为日期,但如果你已经通过
FROM_UNIXTIME
STR_TO_DATE()
DATE_FORMAT()
DATE
DATETIME
'2023-03-15 10:30:00'
DATETIME
SELECT STR_TO_DATE('2023-03-15 10:30:00', '%Y-%m-%d %H:%i:%s') AS parsed_datetime;显然,这个也和直接转换数字时间戳不是一个路子。
所以,回到13位时间戳转日期这个需求,
FROM_UNIXTIME(timestamp_ms / 1000)
在数据库层面处理时间戳,尤其是涉及到查询和索引时,性能问题是需要特别留意的。我见过不少因为时间戳处理不当导致查询效率直线下降的案例。
一个非常常见的性能陷阱是在WHERE
timestamp_ms
-- 性能差的例子 SELECT * FROM your_table WHERE FROM_UNIXTIME(timestamp_ms / 1000, '%Y-%m-%d') = '2023-03-15';
或者
-- 性能差的例子 SELECT * FROM your_table WHERE FROM_UNIXTIME(timestamp_ms / 1000) BETWEEN '2023-03-15 00:00:00' AND '2023-03-15 23:59:59';
这样写的问题在于,MySQL在执行查询时,需要对
timestamp_ms
FROM_UNIXTIME(timestamp_ms / 1000)
timestamp_ms
优化策略是:将函数应用到查询条件的值上,而不是索引列上。 如果你想查询某个日期范围的数据,你应该将日期范围转换为对应的13位时间戳范围,然后直接用时间戳进行比较。
-- 优化后的例子:查询2023年3月15日全天的数据
-- 首先,计算2023-03-15 00:00:00 的13位时间戳
SET @start_ts_ms = UNIX_TIMESTAMP('2023-03-15 00:00:00') * 1000;
-- 然后,计算2023-03-15 23:59:59 的13位时间戳
SET @end_ts_ms = UNIX_TIMESTAMP('2023-03-15 23:59:59') * 1000;
SELECT * FROM your_table
WHERE timestamp_ms >= @start_ts_ms AND timestamp_ms <= @end_ts_ms;这样,
timestamp_ms
另一个相关的考量是数据类型选择:
BIGINT
WHERE
DATETIME
TIMESTAMP
DATETIME
INSERT INTO your_table (datetime_col) VALUES (FROM_UNIXTIME(timestamp_ms / 1000));
在我看来,如果你主要做的是精确到毫秒的时间记录,且查询大部分是基于时间戳范围的,
BIGINT
DATETIME
以上就是MySQL时间格式转换解析 13位时间戳转日期的高效方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号