如何在 Mysql 中以 unix 毫秒为单位存储日期?

Posted

技术标签:

【中文标题】如何在 Mysql 中以 unix 毫秒为单位存储日期?【英文标题】:How to store date in unix millisecond in Mysql? 【发布时间】:2018-08-05 00:51:48 【问题描述】:

如何以 UNIX 毫秒为单位在 mysql 中存储当前日期,例如:1388880000000?

现在我将它存储在日期时间中。

【问题讨论】:

不要。 DateTime 值应存储为 DateTime。除非您有充分的理由以其他方式存储它们(例如支持日期时间的最小值/最大值之外的日期和时间值),否则我建议将其保留在 DateTime 列中。 UNIX_TIMESTAMP & FROM_UNIXTIME 加上乘法/除法 */1000 使用时间戳。见dev.mysql.com/doc/refman/5.7/en/datetime.html 那么,您建议将日期存储在日期时间中吗?并使用 SELECT 格式? 我已经在回答中详细说明了我的评论。希望对您有所帮助。 【参考方案1】:

不要。 DateTime 值应存储为 DateTime,除非您有很好的理由存储它们(例如支持日期和时间值超出 DateTime 的最小值/最大值),我建议应该离开它在DateTime 列中。

您始终可以在Select 期间或在表示层中操作如何从数据库中返回它们。为了从 DateTime 返回 unix 时间,MySql 提供了一个名为 UNIX_TIMESTAMP 的内置方法。要返回毫秒数,只需乘以 1000,因为 unix 时间戳是自 1970 年 1 月 1 日以来的秒数(不包括闰秒)。如果要存储 unix 时间,则必须使用 int 数据类型。

请注意,如果您确实存储 unix 时间而不是将实际的 DateTime 值存储在 DateTime 数据类型列中,您将无法轻松使用数据库中内置的所有日期时间函数。例如,如果您想找出某个特定月份有多少行,您首先必须将数据从 int 转换为 datetime,然后才能进行计算。

您也会失去准确性(因为 unix 时间即使在 1 秒分辨率下也不准确,因为它忽略了闰秒)。

因此,总结一下 - 当数据库为您提供适合数据的数据类型时,不要使用不同的数据类型存储该数据。如果您只想存储日期,请使用Date 数据类型,如果您想存储日期时间值,请使用DateTime 数据类型,如果您想存储一天中的特定时间,请使用Time 数据类型。

附言 在处理日期时间值时,特别是如果您必须处理来自多个位置的客户,请始终在数据库中仅存储 UTC 日期时间,unless, of course, you want to go mad.

【讨论】:

非常好,如果我必须使用 datetime 并使用 UNIX_TIMESTAMP 以秒为单位获取日期,或者将其乘以 1000 以以毫秒为单位。我得到了它。谢谢! 你知道任何不忽略闰秒的DBMS,即'2018-07-01 00:00:01'和'2018-06-30 23:59:59'之间的区别是三秒而不是两秒? 很高兴为您提供帮助 :-)。不是 DBMS 忽略闰秒,而是 unix time by definition is ignoring them. 我知道,但所有 DBMS 也忽略了它。如果运气好的话,你可以加载'2016-06-30 23:59:60',但它会显示为'2016-07-01 00:00:00'(当然,我上一篇文章中的两个时间戳都应该是2016年,而不是2018年)。我所知道的任何 DBMS 都不会真正计算出正确的差异。 @dnoeth 我知道很多计算机系统在应用闰秒时只是重复第 59 秒,以避免处理特殊情况的时间验证。我不知道有任何计算机软件实际上将 23:59:60 视为有效时间。

以上是关于如何在 Mysql 中以 unix 毫秒为单位存储日期?的主要内容,如果未能解决你的问题,请参考以下文章

想要在存储过程中以毫秒为单位获取两个时间戳的差异

如何在 PHP 中以毫秒为单位获取当前时间?

如何在 Ruby 中以毫秒为单位计时?

如何在 c++ 中以毫秒为单位获得系统启动时间?

自Javascript中的unix时代以来,如何以毫秒为单位获取时间? [复制]

为啥 setDate() 在 nodejs 中以毫秒为单位给出最终日期? [复制]