如何在 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 毫秒为单位存储日期?的主要内容,如果未能解决你的问题,请参考以下文章