【问题标题】:MySQL: What's the best to use, Unix TimeStamp Or DATETIME [duplicate]MySQL:最好使用什么,Unix TimeStamp 或 DATETIME [重复]
【发布时间】:2011-02-01 18:57:00
【问题描述】:

可能很多程序员都想问这个问题。它是每一种 MySQL 时间格式的特点。以及您更愿意在您的应用中使用哪一个。

对我来说,我使用 Unix 时间戳,因为也许我发现用它转换和订购记录很容易,也因为我从未尝试过 DATETIME 的事情。但无论如何,如果有人告诉我我错了,我已经准备好改变主意了。

谢谢

【问题讨论】:

标签: php mysql datetime unix-timestamp


【解决方案1】:

时间戳(PHP 和 MySQL 的) 使用 32 位 (即 4 字节) 整数存储;这意味着它们仅限于从 1970 年到 2038 年的日期范围。

DATETIME 没有这个限制——但是使用更多字节存储(如果我没记错的话,8 个字节)


之后,在存储 PHP 所见的时间戳或 MySQL 所见的时间戳之间:


而且,有关 MySQL 的 TIMESTAMPDATETIME 数据类型之间的更多信息,请参阅 10.3.1. The DATETIME, DATE, and TIMESTAMP Types

【讨论】:

  • 它们现在限制为 32 位 :)
  • 2038 年谁在使用 32 位系统?
  • new java.util.Date().getTime() 已经是 64 位了。
  • Unix 时间戳,带符号的 32 位整数,可以一直存储到 1901 年的日期,因为它可以从 -2147483647(1901 年 12 月 13 日晚上 8:45:53 UTC)到 2147483647 (UTC 时间 2038 年 1 月 19 日凌晨 3:14:07)
  • @LukeStevenson,你已经在每个问题中发布了这个。我想知道除了通知目的之外,您还想通过这样做来达到什么目的?使用您试图指示的 UNIX 时间戳有什么缺点吗?
【解决方案2】:

正如其他人所说,时间戳可以代表较小范围的日期时间(从 1970 年到 2038 年)。但是,时间戳测量自 Unix 纪元 (1970-01-01 00:00:00 UTC) 以来的秒数,从而使它们独立于时区,而 DATETIME 存储没有时区的日期和时间。换句话说,时间戳明确引用特定时间点,而 DATETIME 引用的确切时间点需要时区(未存储在 DATETIME 字段中)。要了解这为何重要,请考虑如果我们更改时区会发生什么。

假设我们要存储日期时间 2010-03-27 12:00 UTC。如果我们存储它并使用时间戳或 DATETIME 检索它,那么通常看起来没有区别。但是,如果服务器现在更改为本地时区为 UTC+01,那么如果我们提取日期时间,我们会得到两个不同的结果。

如果我们将该字段设置为 DATETIME,它会将日期时间报告为 2010-03-27 12:00,尽管时区发生了变化。如果我们将该字段设置为时间戳,则日期将报告为 2010-03-27 11:00。这不是任何一种数据类型的问题——这只是它们存储的信息略有不同的结果。

【讨论】:

  • Unix 时间戳,带符号的 32 位整数,可以一直存储到 1901 年的日期,因为它可以从 -2147483647(1901 年 12 月 13 日晚上 8:45:53 UTC)到 2147483647 (UTC 时间 2038 年 1 月 19 日凌晨 3:14:07)
【解决方案3】:

这真的取决于。我会给你两个例子,其中一个克服另一个:

当您想要将用户会话存储在数据库中并且会话创建时间(以时间戳格式)用于快速行检索(带索引)时,时间戳优于 DATETIME。
例如。表可能如下所示:
[session_create_time AS Timestamp][IP_address AS 32bit Int][etc...]
在前两列上建立索引可以真正加快查询速度。如果您有 session_create_time 字段的 DATETIME 值类型,则可能需要更多时间。考虑到每次用户请求页面时都会执行会话查询,因此效率至关重要。

当您想要存储用户的出生日期或一些需要灵活时间范围的历史事件时,DATETIME 优于 Timestamp。

【讨论】:

  • Unix 时间戳,带符号的 32 位整数,可以一直存储到 1901 年的日期,因为它可以从 -2147483647(1901 年 12 月 13 日晚上 8:45:53 UTC)到 2147483647 (UTC 时间 2038 年 1 月 19 日凌晨 3:14:07)。因此,除非您存储 1901 年之前的日期,否则时间戳将起作用。
【解决方案4】:

除非将 1970 年 1 月 1 日之前的记录数字化,否则我喜欢 UNIX 时代。这只是一个偏好问题,当使用多种语言时,整个无符号数字更容易处理。

请记住,这个时代始于 1970 年 1 月 1 日。在此之前,很多公司已经经营了几十年,甚至更长时间。

【讨论】:

  • Unix 时间戳,带符号的 32 位整数,可以一直存储到 1901 年的日期,因为它可以从 -2147483647(1901 年 12 月 13 日晚上 8:45:53 UTC)到 2147483647 (UTC 时间 2038 年 1 月 19 日凌晨 3:14:07)
猜你喜欢
  • 2017-01-25
  • 2018-11-09
  • 2017-07-08
  • 2014-08-17
  • 2020-12-16
  • 1970-01-01
  • 2011-12-31
  • 2015-04-20
  • 1970-01-01
相关资源
最近更新 更多