在Ruby on Rails中,DateTime,Timestamp,Time和Date有什么区别?

根据我的经验,编程时的date/时间总是充满危险和困难。

如果仅仅是由于select压倒多数的话,Ruby和Rails在这个问题上一直困扰着我; 我从来没有任何想法,我应该select。

当我使用Rails并查看ActiveRecord数据types时,我可以find以下内容

:datetime,:timestamp,:time和date

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

有什么不同? 你用什么来做?

(PS我正在使用Rails3)

ActiveRecord中不同的date/时间格式之间的区别与Rails无关,与您使用的任何数据库无关。

使用MySQL作为例子(如果没有其他原因,因为它是最stream行的),你有DATEDATETIMETIMETIMESTAMP列数据types; 就像你有CHARVARCHARFLOATINTEGER

所以,你问,有什么区别? 那么,其中一些是不言自明的。 DATE只存储一个date, TIME只存储一天的时间,而DATETIME存储这两个date。

DATETIMETIMESTAMP之间的区别稍微微妙一些: DATETIME被格式化为YYYY-MM-DD HH:MM:SS 。 有效范围从1000年到9999年(以及其间的所有内容),而当从数据库中获取时, TIMESTAMP 看起来是相似的,它实际上只是一个unix时间戳的前沿,其有效范围从1970年到2038年。除了数据库引擎中的各种内置函数之外,这里的差异是存储空间,因为DATETIME存储年,月,日,时,分,秒的每个数字,所以总共占用8个字节。存储自1970-01-01以来的秒数,它使用4个字节。

你可以在这里阅读更多关于MySQL中的时间格式之间的差异。

最后,这涉及到你需要你的date/时间列做什么。 你需要在1970年以前或2038年以后存储date和时间吗? 使用DATETIME 。 你需要担心数据库的大小,你在这个时间范围内? 使用TIMESTAMP 。 你只需要存储一个date? 使用DATE 。 你只需要存储一个时间? 使用TIME

说完所有这些, Rails实际上为你做了一些这些决定 。 两者:timestamp:datetime将默认为DATETIME ,而:date:time对应于DATETIME

这意味着在Rails中,你只需要决定是否需要存储date,时间或两者兼而有之。

  1. :datetime(8字节)

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

    • 存储自1970-01-01以来的秒数
    • 对像updated_at,created_at这样的列很有用
  3. :date(3字节)
    • 存储date
  4. :时间(3个字节)
    • 存储时间