【问题标题】:In Ruby on Rails, what's the difference between DateTime, Timestamp, Time and Date?在 Ruby on Rails 中,DateTime、Timestamp、Time 和 Date 有什么区别?
【发布时间】:2011-04-25 02:30:10
【问题描述】:

根据我的经验,在编程时确定日期/时间总是充满危险和困难。

Ruby 和 Rails 在这个问题上总是让我望而却步,如果只是因为选择太多的话;我从来不知道我应该选择哪个。

当我使用 Rails 并查看 ActiveRecord 数据类型时,我可以找到以下内容

:datetime、:timestamp、:time 和:date

并且不知道有什么区别或陷阱潜伏在哪里。

有什么区别?你用它们做什么?

(P.S. 我用的是 Rails3)

【问题讨论】:

  • 我认为部分混淆还在于 ActiveRecord 类型不对应于 Ruby 类型(例如 DateTime)和 Rails 层甚至其他类型(例如 TimeWithZone) .

标签: ruby-on-rails datetime date time timestamp


【解决方案1】:

ActiveRecord 中不同日期/时间格式之间的差异与 Rails 几乎没有关系,而与您使用的任何数据库有关。

以 MySQL 为例(如果没有其他原因,因为它最受欢迎),您有 DATEDATETIMETIMETIMESTAMP 列数据类型;就像你有 CHARVARCHARFLOATINTEGER

所以,你问,有什么区别?好吧,其中一些是不言自明的。 DATE 只存储日期,TIME 只存储一天中的时间,而DATETIME 两者都存储。

DATETIMETIMESTAMP 之间的区别有点微妙:DATETIME 的格式为 YYYY-MM-DD HH:MM:SS。有效范围从 1000 年到 9999 年(以及介于两者之间的所有内容。当您从数据库中获取 TIMESTAMP 看起来)时,它实际上只是 unix timestamp 的一个前端。它的有效范围从1970年到2038年。这里的区别,除了数据库引擎中的各种内置函数外,还有存储空间。因为DATETIME存储了年、月、日、小时、分钟和秒的每个数字,它总共用了 8 个字节。由于TIMESTAMP 只存储自 1970-01-01 以来的秒数,所以它使用了 4 个字节。

您可以阅读更多关于 MySQL here 中时间格式之间差异的信息。

最后,归结为您需要日期/时间列来做什么:

  • 是否需要存储 1970 年之前或 2038 年之后的日期和时间? => 使用DATETIME
  • 您是否需要担心数据库大小并且您在该时间范围内? => 使用TIMESTAMP
  • 您只需要存储一个日期吗? => 使用DATE
  • 您只需要存储一个时间吗? => 使用TIME

说了这么多,Rails 实际上会为您做出其中的一些决定:timestamp:datetime 都将默认为 DATETIME,而 :date:time 分别对应于 DATETIME

这意味着在 Rails 中,您只需决定是否需要存储日期、时间或两者。

【讨论】:

  • 作为记录,我更喜欢绝对时间戳 (unix),因为 YYYY-MM-DD 格式取决于所使用的时区。所以客户端需要知道服务器的时区,并且需要进行转换。 Seconds-since-1970 绝对时间戳没有这个问题。
  • @n13 好点,但在 Rails 中并不是真正的问题,因为它会在将日期时间插入数据库之前转换为 UTC。
  • 这是 Rails 世界中最有用的帖子之一。这应该添加到 rails 指南...
  • MySQL 的 TIME 列并不是严格意义上的“一天中的时间”,因为它接受 > 24 小时;它也可用作“经过时间”。
  • 其他数据库也是这样吗?例如postgres?
【解决方案2】:
  1. :日期时间(8 字节)

    • 以 YYYY-MM-DD HH:MM:SS 格式存储日期和时间
    • 对于像birth_date 这样的列很有用
  2. :时间戳(4字节)

    • 存储自 1970-01-01 以来的秒数
    • 对于updated_at、created_at 等列很有用
  3. :日期(3 个字节)
    • 存储日期
  4. :时间(3 个字节)
    • 存储时间

【讨论】:

  • 这更像是上面接受的答案的 TL:DR 版本
【解决方案3】:

这是我发现的一个很棒且精确的解释。

TIMESTAMP 用于跟踪记录的变化,并且每次更新 记录被更改。 DATETIME 用于存储特定的和静态的 不受任何记录更改影响的值。

TIMESTAMP 也受不同 TIME ZONE 相关设置的影响。 DATETIME 是常数。

TIMESTAMP 在内部将当前时区转换为 UTC 进行存储, 并在检索期间转换回当前时区。 DATETIME 不能这样做。

TIMESTAMP 为 4 个字节,DATETIME 为 8 个字节。

TIMESTAMP 支持的范围:‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07' UTC DATETIME 支持范围:'1000-01-01 00:00:00' 到 ‘9999-12-31 23:59:59’

来源:https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant

还有……

table with different column "date" types and corresponding rails migration types depending on the database

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多