核心思路是将13位毫秒级时间戳除以1000转为秒级,再用FROM_UNIXTIME转换为日期时间,最后通过DATE_FORMAT、DATE或CAST等函数格式化为YYYY-MM-DD。常用方法包括:①DATE_FORMAT(FROM_UNIXTIME(ts/1000), '%Y-%m-%d');②DATE(FROM_UNIXTIME(ts/1000));③CAST(FROM_UNIXTIME(ts/1000) AS DATE)。需注意字段应为BIGINT类型,避免精度丢失,并关注时区一致性问题。
MySQL中将13位时间戳转换为
YYYY-MM-DD
FROM_UNIXTIME
DATE_FORMAT
DATE
在MySQL里,处理13位时间戳(通常是毫秒级的Unix时间戳)并将其转换为
YYYY-MM-DD
方案一:使用FROM_UNIXTIME
DATE_FORMAT
这是最常见也最灵活的办法。13位时间戳比我们熟悉的10位时间戳(秒级)多出了三位,那多出来的就是毫秒。所以,第一步自然是把它变成秒级。
SELECT DATE_FORMAT(FROM_UNIXTIME(your_13_digit_timestamp_column / 1000), '%Y-%m-%d') AS formatted_date;
这里
your_13_digit_timestamp_column
FROM_UNIXTIME()
DATE_FORMAT()
%Y-%m-%d
方案二:使用FROM_UNIXTIME
DATE
如果你只是纯粹想得到日期部分,而不需要关心具体的格式化字符串,
DATE()
SELECT DATE(FROM_UNIXTIME(your_13_digit_timestamp_column / 1000)) AS extracted_date;
这个方案输出的日期格式默认也是
YYYY-MM-DD
%Y-%m-%d
方案三:使用FROM_UNIXTIME
CAST
CONVERT
虽然不如前两种常用,但通过显式类型转换也能达到目的。
CAST
CONVERT
DATE
SELECT CAST(FROM_UNIXTIME(your_13_digit_timestamp_column / 1000) AS DATE) AS casted_date; -- 或者 SELECT CONVERT(FROM_UNIXTIME(your_13_digit_timestamp_column / 1000), DATE) AS converted_date;
这两种方式在功能上基本等同。我通常不会优先选择这个,因为它感觉上多了一层转换,但如果你习惯于这种显式的类型转换思维,它也是一个可行的选择。重要的是,无论哪种方案,核心都是那个
/ 1000
这其实是个很常见的问题,我最近就在处理一个类似的数据源。简单来说,10位时间戳代表的是自Unix纪元(1970年1月1日00:00:00 UTC)以来经过的“秒数”,而13位时间戳则代表“毫秒数”。
很多编程语言和系统,尤其是Java(
System.currentTimeMillis()
Date.now()
FROM_UNIXTIME
处理时间戳,尤其是从不同系统导入的数据,总会遇到一些意想不到的问题。我个人就踩过不少坑,有些是数据类型的问题,有些则是时区在捣鬼。
一个大坑是数据类型选择不当。如果你的13位时间戳字段在数据库里定义成了
INT
INT
BIGINT
DATETIME
TIMESTAMP
另一个让我头疼的是时区问题。
FROM_UNIXTIME
CONVERT_TZ
还有就是精度丢失。虽然我们这里是为了得到
YYYY-MM-DD
DATETIME
DATETIME(FSP)
TIMESTAMP(FSP)
FSP
DATETIME(3)
DATETIME
13位时间戳,虽然在存储时可能需要
BIGINT
首先是时间序列分析。既然是时间戳,那自然可以用来观察数据随时间变化的趋势。比如,通过
FROM_UNIXTIME(timestamp_col / 1000)
DATE_FORMAT
其次是计算时间间隔和持续时间。如果你有两个13位时间戳,比如一个事件的开始时间和结束时间,你可以将它们都转换为秒级时间戳,然后直接相减,得到事件持续的秒数。再通过
DATEDIFF()
TIMESTAMPDIFF()
另外,它也是数据过滤和筛选的利器。比如,你想查询某个特定日期范围内的数据,可以直接将日期字符串转换为Unix时间戳,然后与你的13位时间戳字段(除以1000后)进行比较。
-- 查找2023年10月1日到2023年10月31日的数据 SELECT * FROM your_table WHERE your_13_digit_timestamp_column / 1000 BETWEEN UNIX_TIMESTAMP('2023-10-01 00:00:00') AND UNIX_TIMESTAMP('2023-10-31 23:59:59');
这种基于时间戳的范围查询效率通常很高,特别是如果你的时间戳字段有索引的话。它比基于字符串日期的范围查询更可靠,也更不容易出错。总的来说,13位时间戳虽然在转换时多了一步除法,但它作为一种统一的时间表示方式,在数据分析和查询优化方面都提供了很大的灵活性。
以上就是MySQL日期格式转换 13位时间戳转YYYY-MM-DD的三种方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号