MySQL日期转换函数 13位时间戳转标准日期的代码示例

哎呀,我需要和你谈谈这件事。
一年前我在一个电商项目上做这个,当时真的很沮丧。

你说的方法是正确的。
当时,我们的表中有一个名为 order_time_ms 的列,存储了 1 3 位毫秒时间戳。
如果要转换为标准日期,必须先将其除以1 000,转换为秒,然后使用FROM_UNIXTIME()。

当时我写了一个简单的问题,怎么样?也许像你的例子:
sql 选择 FROM_UNIXTIME (order_time_ms / 1 000) AS standard_datetime, FROM_UNIXTIME(order_time_ms / 1 000, '%Y-%m-%d %H:%i:%s') AS formatted_detetime 来自订单 其中 order_time_ms 介于 1 6 7 8 8 09 6 00000 和 1 6 7 8 8 9 5 9 9 9 9 9 9 之间;
这可以解决大多数情况。
但接下来有一个问题,就是如果order_time_ms是string类型的话,是不能直接删除的。
记得有一次在导入数据的时候,直接将数据源导入成字符串,就报错了。
当时我想应该先化为数字,然后除法。
于是改为:
sql 选择 FROM_UNIXTIME(CAST(order_time_ms AS DECIMAL(1 6 ,3 )) / 1 000) AS standard_time_time FROM 订单;
现在。

另一件事是撤消转换并将标准日期转换为 1 3 位毫秒时间戳。
我们使用 UNIX_TIMESTAMP() 将其转换为秒,然后乘以 1 000。
让我告诉你,这里有一个问题,UNIX_TIMESTAMP() 会错过毫秒。
我们当时有一个要求,要精确到毫秒,但是一用这个函数,毫秒数字就没有了。
当时我们想,不妨停止切换,直接使用 UNIX_TIMESTAMP(NOW()) 1 000 来获取当前时间的 1 3 位毫秒时间戳,或者在保存时直接存储 1 3 位毫秒数,使用 BIGINT 类型。

为什么FROM_UNIXTIME()不能直接消费1 3 位毫秒时间戳,这个问题我也咨询过技术专家。
这是因为在设计时,Unix时间戳以秒为单位,因此该函数必须首先判断它是否是秒。
如果毫秒太多,就会变得混乱并导致问题。
所以必须手动除以1 000。

在实际使用中,我们推荐使用DATETIME(3 )或TIMESTAMP(3 )来存储以毫秒为单位的日期和时间,并且易于读取。
但如果您只是想存储时间戳以防止溢出,那么请使用 BIGINT。

关于时区,我们的项目是跨时区的,所以我们使用了TIMESTAMP类型,它会自动处理时区,并且当你查询时,它会按照你设置的时区返回,这很好。
如果项目时区固定的话,使用DATETIME是没有问题的。

还有,不要盲目使用隐式转换,使用显式函数,如STR_TO_DATE()、DATE_FORMAT(),这样更安全,性能也更好。
关于索引,我告诉你,在日期范围查询列上建立索引是正确的,但不能在索引列上使用函数。
例如,如果您输入 WHERE FROM_UNIXTIME(timestamp_ms/1 000) > '2 02 3 -01 -01 ',这肯定会使索引无效。
你应该优化为 WHERE timestamp_ms/1 000 > UNIX_TIMESTAMP('2 02 3 -01 -01 ') 这样就可以直接比较值来使用索引了。

更多关于end,对于复杂的日期计算,比如定义节假日等,不要在数据库中进行。
让它在应用层完成,数据库将负责访问它。
它简单而高效。

这里,我已经详细的告诉大家了。
它们都是真实的,不是虚构的。
看看它对你有用吗?

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

Hi,说到MySQL对时间戳的处理,我确实有一些经验。
记得第一次连接MySQL的时候,有一段时间因为这个1 3 位的毫秒时间戳而头疼。

说实话,我不明白为什么 MySQL 在 1 3 位毫秒时间戳出现后要求我们将其除以 1 000。
查了资料原来MySQL内置函数默认处理的是秒级时间戳,1 3 位是毫秒级的,所以只好手动转换。

比如我之前做的一个项目,里面的数据是1 3 位的时间戳,单位是毫秒。
当时我写了一条SQL语句,首先将毫秒时间戳除以1 000,然后使用FROM_UNIXTIME()函数将其转换为日期时间格式。
代码可能如下所示:
sql 选择 FROM_UNIXTIME(timestamp_ms/1 000) 作为转换的日期时间 根据我的数据;
有趣的是,后来我发现MySQL 5 .6 .4 及更高版本也支持毫秒信息的实时显示。
当时,我认为这是一件非常人性化的事情,因为我知道我们有时需要如此精确的时间信息。

例如,有时客户需要自定义日期格式,我会使用DATE_FORMAT()函数来满足他们的需求。
例如,如果我只想显示日期,我会输入:
sql SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp_ms/1 000), '%Y-%m-%d') 作为转换日期 根据我的数据;
我再次遇到了以毫秒为单位显示信息的要求。
当时不太理解,所以尝试使用MOD和LPAD来绑定毫秒部分,结果成功了:
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_string 根据我的数据;
话虽如此,我应该提到,如果您使用 MySQL 版本 8 .0.1 7 或更高版本,则获取当前时间的 1 3 位时间戳要容易得多。
您可以只使用 UNIX_TIMESTAMP(NOW(3 ))1 000。
但是,为了向后兼容,您可能必须手动粘贴秒和毫秒。

当然,在处理时间戳时,还应该注意时区问题。
例如,NOW() 函数返回服务器的时区,而 UTC_TIMESTAMP() 函数返回 UTC 时间。
当时我不明白为什么时区很重要,后来我了解到,统一存储UTC时间,然后在应用层按用户的时区显示可以避免不同地区的数据存在偏差。

总的来说,MySQL处理1 3 位毫秒时间戳的方法非常简单。
只要掌握这些技巧,就可以轻松满足不同的需求。
当然,还应该注意版本兼容性和数据类型选择。
这些是避免陷阱的关键。

MySQL日期格式转换 13位时间戳转YYYY-MM-DD的三种方案

结论: 方案一:使用DATE_FORMAT和FROM_UNIXTIME,灵活且可定制。
选项2 :使用DATE函数,该函数很简单,只接受日期。
方案三:使用CAST或者CONVERT,这样就清楚了,类型转换也清晰。
注意:字段使用BIGINT,时区必须统一,可能会损失准确性。
建议:根据需要优先考虑选项 1 或 2