MySQL时间戳转换技巧 详解13位时间戳转日期格式的实现方法

上周,一位客户问我如何在 MySQL 中将 1 3 位毫秒日志转换为每日格式。
这个操作非常简单。
首先,需要将毫秒级时间戳除以 1 000,将其转换为秒级时间戳,然后使用 FROM_UNIXTIME() 函数将其转换为 DATETIME 或 TIMESTAMP 类型。
将时间从微秒转换为人类可读的小时、分钟和秒。

例如,您有一个名为your_table_name的表,并且有一个名为indication_ms的字段,该字段是一个1 3 位数字,表示千分之一秒。
您可以编写这样的查询:
sql SELECT FROM_UNIXTIME(timestamp_ms/1 000) AS Convert_datetime FROM your_table_name;
如果还想给出一个格式,比如想转换为“年月日时:分:秒”的格式,函数:
sql DATE_FORMAT(FROM_UNIXTIME(timestamp_ms/1 000), '%Y-%m-%d %H:%i:%s') AS "精确秒数", DATE_FORMAT(FROM_UNIXTIME(timestamp_ms/1 000), 年%Y月%d日%H时%i分%秒') AS "中文格式" FROM your_table_name;
当然,这里有几点需要注意:
1 .如果表示时间的字段是VARCHAR类型,直接除以1 000可能会出现问题。
确保类型为 BIGINTY,或使用 FACT 不将其转换为第一个类型。

2 NO加工价值也很关键。
FROM_UNIXTIME 将返回 NULL。
您需要默认值。

3 时区问题也很常见。
FROM_UNIXTIME() 使用时区作为默认值。
如果要替换 UTC 数据,则需要对其进行调整。

4 避免嵌套函数查询,因为无法使用索引。

5 转换为应用程序调度有时会更高效,尤其是在性能要求较高的场景中。

综上所述,这个过程的核心步骤是:1 3 位指示→除以1 000→FROM_UNIXTIME()→DATE_FORMAT()(可选)。
考虑到这些因素,您可以高效、准确地转换时间信号。
无论如何,这取决于你。

Excel实践之时间戳格式与日期格式的互转

说白了,Excel对UNIX时间戳的处理有两个关键点:数字对公式的影响,以及Excel日期基线的缺点。

我们先来说说最重要的事情。
1 3 位时间戳代表毫秒(自 1 9 7 0 年 1 月 1 日起),而 1 0 位时间戳代表秒。
去年我们运行了这个项目,有 3 000 条数据。
我们直接使用文本函数来设置公式,效率惨不忍睹。
例如,对于 1 3 位时间戳,Excel 默认将 1 9 00 年 1 月 1 日作为序列的第一天,因此需要对公式进行修正,添加 1 9 天(7 0 年 - 1 年),除以 1 000 毫秒,然后按照 2 4 小时制进行划分。
其次转换原则与excel日期序列值相差2 天。
Excel 将 1 9 00 年视为闰年,但 Unix 时间戳从 1 9 7 0 年开始,因此公式中固定为 1 9 天。
如果您使用 1 9 04 日期系统,则需要对其进行转换。

我一开始以为只要右键设置时间就可以了,后来发现不对劲,尤其是毫秒的时间戳会失真。
等等,还有一件事。
如果数据量很大,建议使用VBA进行批量处理,比手动准备效率提高1 00倍。

最严重的威胁是Excel日期系统分为两种:1 9 00年和1 9 04 年。
如果混合使用,转换结果将相差4 3 8 天。
工作簿日期系统建议使用开发者工具中的“高级编辑器”来检查设置。

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

那天我正在帮朋友调试一个旧系统,发现数据库中的时间戳居然有1 3 位数字。
他挠了挠头,说这和他几年前连接的接口是一样的,使用的是Java时间戳。
当时在MySQL中尝试了一下,过渡还算顺利。

例如,有一个表 my_data,其中包含一个 timestamp_ms 字段,该字段存储 1 3 位毫秒时间戳。
转换为日期的常见方法是除以 1 000,然后使用 FROM_UNIXTIME():
sql 选择 FROM_UNIXTIME(timestamp_ms/1 000) AS conversion_datetime 根据我的数据;
这会将毫秒转换为标准 YYYY-MM-DD HH:MM:SS 格式。
如果您需要自定义格式,例如仅显示日期或精确到秒,请添加 DATE_FORMAT():
sql -
仅显示日期 SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp_ms/1 000), '%Y-%m-%d') AS conversion_date FROM my_data;
-
精确到秒 SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp_ms/1 000), '%Y-%m-%d %H:%i:%s') AS formatted_datetime 根据我的数据;
有时需要保留毫秒小数,特别是MySQL 5 .6 .4 及更高版本支持微秒精度。
您可以使用 MOD 获取其余部分并将其连接起来:
sql SELECT CONCAT(DATE_FORMAT(FROM_UNIXTIME(timestamp_ms/1 000), '%Y-%m-%d %H:%i:%s'), '.', LPAD(MOD(timestamp_ms, 1 000), 3 , '0')) AS datetime_with_ms 根据我的数据;
相反,将日期转换回 1 3 位时间戳也很简单。
使用UNIX_TIMESTAMP()获取二级时间戳并乘以1 000:
sql 选择 UNIX_TIMESTAMP(event_time) 1 000 AS timestamp_ms 来自我的活动;
如果需要更高的精度,特别是MySQL 5 .6 .4 +版本支持微秒精度,可以这样处理:
sql 选择楼层(UNIX_TIMESTAMP(event_time)) 1 000 + 楼层(微秒(event_time)/1 000) AS 精确时间戳_毫秒 来自我的活动;
获取当前时间的1 3 位时间戳,MySQL 8 .0.1 7 +可以直接使用:
sql 选择 UNIX_TIMESTAMP(NOW(3 )) 1 000 AS current_timestamp_ms;
旧版本需要手动连接:
sql 选择楼层(UNIX_TIMESTAMP(NOW())) 1 000 + 楼层(微秒(NOW()) / 1 000) AS current_timestamp_ms;
但要注意时区问题。
例如,NOW() 返回服务器时区的时间,UTC_TIMESTAMP() 返回 UTC 时间。
通常最好统一存储UTC时间,然后根据用户所在的时区在应用层显示。
在使用 CONVERT_TZ() 转换时区之前,请确保时区表已加载。

数据类型的选择也很重要。
DATETIME范围是1 000-01 -01 到9 9 9 9 -1 2 -3 1 ,没有时区信息,适合存储固定时间点。
TIMESTAMP范围较小(1 9 7 0-01 -01 到2 03 8 -01 -1 9 UTC),受时区影响,适合需要自动转换的情况。

还要注意版本兼容性。
MySQL 5 .6 .4 之前不支持微秒精度,UNIX_TIMESTAMP() 只会返回秒级结果。
如果需要毫秒精度,请确保使用版本 5 .6 .4 + 和定义的字段是 DATETIME(3 ) 或 DATETIME(6 )。

等一下,我突然有一个问题。
为什么时间戳必须有 1 3 位?结果 1 0 位是秒的 Unix 标准,1 3 位是毫秒。
它们常见于 JavaScript 的 Date.now() 或 Java 的 System.currentTimeMillis() 中。
MySQL之所以需要除以1 000,是因为它的内置函数默认处理秒级时间戳。

但是,我最近遇到一个使用Go作为前端的项目,它的时间戳是1 4 纳秒。
如果这是直接存储在MySQL中,我们应该如何处理呢?