要将mysql中的13位毫秒级时间戳转换为标准日期格式,必须先将其除以1000转换为10位秒级时间戳,再使用from_unixtime()函数进行转换,例如select from_unixtime(your_13_digit_timestamp / 1000) as standard_datetime from your_table_name;若需自定义输出格式,可结合date_format()函数,如按年月日时分秒显示可使用date_format(from_unixtime(your_13_digit_timestamp / 1000), '%y-%m-%d %h:%i:%s');实际应用中需注意时区问题,建议统一存储utc时间并在应用层根据用户时区展示,同时确保时间戳字段使用bigint类型以避免溢出,对于大规模数据应避免在查询中对时间戳列使用函数导致索引失效,推荐将日期范围转换为时间戳后直接比较以提升性能,此外处理null值时可结合coalesce函数设定默认值,遵循这些方法可准确高效地完成时间戳转换并规避常见陷阱。

MySQL中将13位时间戳(毫秒级)转换为标准日期格式,核心在于将其转换为10位时间戳(秒级),再利用
FROM_UNIXTIME()
我发现很多朋友在处理MySQL里的时间戳时,特别容易在13位和10位之间犯迷糊。我们日常看到的或者系统生成的很多时间戳,尤其是前端或者某些API返回的,往往是13位的,精确到毫秒。但MySQL内置的
FROM_UNIXTIME()
要解决这个问题,其实非常直接,就是做个简单的除法。你需要将13位的毫秒级时间戳除以1000,把它降维成秒级,然后再使用
FROM_UNIXTIME()
假设你的13位时间戳字段叫做
your_13_digit_timestamp
SELECT
FROM_UNIXTIME(your_13_digit_timestamp / 1000) AS standard_datetime
FROM
your_table_name;这条SQL语句会把
your_13_digit_timestamp
FROM_UNIXTIME()
'YYYY-MM-DD HH:MM:SS'
如果你需要更精细的格式控制,比如只显示日期、或者只显示小时分钟,那就可以结合
DATE_FORMAT()
SELECT
DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp / 1000), '%Y-%m-%d %H:%i:%s') AS formatted_datetime_full,
DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp / 1000), '%Y-%m-%d') AS formatted_date_only,
DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp / 1000), '%H:%i:%s') AS formatted_time_only
FROM
your_table_name;在实际操作中,确保你的13位时间戳字段的数据类型是
BIGINT
INT
这几乎是我在职业生涯中被问到频率最高的问题之一了。说实话,我刚开始接触这块的时候,也踩过不少坑。核心原因,就像前面提到的,就是单位不对等。你给MySQL的是毫秒,但它期待的是秒。
Unix时间戳(Unix timestamp)是一个很重要的概念,它通常指的是从1970年1月1日00:00:00 UTC(协调世界时)开始经过的秒数。所以,当你在MySQL里使用
FROM_UNIXTIME()
如果你手头有一个13位的时间戳,比如
1678886400000
FROM_UNIXTIME()
1678886400000
55219-09-17 08:00:00
所以,当你发现转换出来的日期时间“不对劲”,或者“太未来了”,那八成就是忘了除以1000。这就像是你手上有一堆毫秒级的数据,但数据库只认秒,你不做这个单位换算,那结果肯定天差地别。别看这只是一个简单的除法,但它背后的逻辑是理解Unix时间戳的关键。
MySQL在日期时间格式化方面提供了非常强大的功能,主要就是通过
DATE_FORMAT()
这里列举一些常用的格式代码,你可以随意组合:
%Y
%Y
%m
%c
%d
%e
%H
%H
%I
%I
%s
%f
%p
%W
%a
%j
结合
FROM_UNIXTIME(your_13_digit_timestamp / 1000)
SELECT DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp / 1000), '%Y-%m-%d') AS date_only;
SELECT DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp / 1000), '%H:%i:%s') AS time_only;
SELECT DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp / 1000), '%h:%i:%s %p') AS time_12_hour;
ELT()
DAYOFWEEK()
DATE_FORMAT
SELECT
CONCAT(DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp / 1000), '%Y年%m月%d日 '),
ELT(DAYOFWEEK(FROM_UNIXTIME(your_13_digit_timestamp / 1000)), '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六')) AS formatted_chinese_date;这个例子稍微复杂一点,但它展示了
DATE_FORMAT
实际开发中,时间戳转换远不止一个简单的除法那么轻松。我遇到过不少因为处理不当导致的数据混乱、时区错位甚至性能问题。这里我总结一些常见的陷阱和一些我个人认为的最佳实践。
常见陷阱:
FROM_UNIXTIME()
1678886400
FROM_UNIXTIME()
2023-03-15 08:00:00
VARCHAR
NULL
FROM_UNIXTIME(NULL)
NULL
NULL
COALESCE()
FROM_UNIXTIME(timestamp / 1000)
最佳实践:
CONVERT_TZ()
SET time_zone = 'your_timezone';
BIGINT
INT
BIGINT
DATETIME
TIMESTAMP
DATETIME
WHERE your_13_digit_timestamp BETWEEN ... AND ...
your_13_digit_timestamp
FROM_UNIXTIME()
WHERE
-- 查找2023年3月15日当天的数据
SELECT *
FROM your_table_name
WHERE your_13_digit_timestamp >= UNIX_TIMESTAMP('2023-03-15 00:00:00') * 1000
AND your_13_digit_timestamp < UNIX_TIMESTAMP('2023-03-16 00:00:00') * 1000;这样
your_13_digit_timestamp
VARCHAR
处理时间戳,尤其是涉及到不同精度和时区时,确实需要多一份细心。但只要理解了其背后的原理,并遵循一些最佳实践,就能避免很多不必要的麻烦。
以上就是MySQL日期转换方案 13位时间戳转标准格式的完整教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号