在Ruby on Rails中,DateTime,Timestamp,Time和Date之间的区别是什么?

时间:2010-10-13 21:40:41

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

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

Ruby和Rails在这个问题上总是让我不知所措,只是因为有大量的选择;我从来不知道应该选哪个。

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

  

:datetime,:timestamp,:time和:date

并且不知道差异是什么或者潜伏在哪里。

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

(P.S。我正在使用Rails3)

3 个答案:

答案 0 :(得分:543)

ActiveRecord中不同日期/时间格式之间的差异与Rails没什么关系,而且与你正在使用的数据库有关。

使用MySQL作为示例(如果没有其他原因,因为它最受欢迎),您有DATEDATETIMETIMETIMESTAMP列数据类型;就像您有CHARVARCHARFLOATINTEGER一样。

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

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

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

最后,它归结为您需要的日期/时间列。您需要在1970年之前或2038年之后存储日期和时间吗?使用DATETIME。您是否需要担心数据库大小并且您在该时间范围内?使用TIMESTAMP。你只需要存储日期吗?使用DATE。你只需要存储时间吗?使用TIME

说完所有这些之后, Rails实际上会为您做出一些决定:timestamp:datetime都默认为DATETIME,而:date:time分别对应DATETIME。< / p>

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

答案 1 :(得分:11)

  1. :datetime(8个字节)

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

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

答案 2 :(得分:0)

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

  

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

     

TIMESTAMP还受与TIME ZONE相关的其他设置的影响。   DATETIME是常数。

     

TIMESTAMP内部将当前时区转换为UTC进行存储,   并在检索过程中将返回时间转换为当前时区。   DATETIME无法做到这一点。

     

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

     

TIMESTAMP支持的范围:UTC到1970年1月1日00:00:01到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