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


414

以我的经验,在编程时正确安排日期/时间总是充满危险和困难。

Ruby和Rails一直以来都让我望而却步,即使是由于大量的选择,也是如此。我从不知道该选哪个。

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

:datetime,:timestamp,:time和:date

而且不知道它们之间的差异是什么或陷阱潜伏在哪里。

有什么不同?你用它们做什么?

(PS我正在使用Rails3)

Answers:


572

ActiveRecord中不同日期/时间格式之间的差异与Rails无关,而与使用的数据库无关。

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

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

DATETIME和之间的区别TIMESTAMP更加微妙:DATETIME格式为YYYY-MM-DD HH:MM:SS。有效范围是从1000年到9999年(以及介于两者之间的所有时间。从数据库中获取时TIMESTAMP 看起来很相似,但实际上它只是unix时间戳的开头。其有效范围是1970年到2038年。)在这里,除了各种内置的数据库引擎中的功能,是存储空间。由于DATETIME存储在年月日,小时,分钟每个数字和第二,它采用了共8个字节。由于TIMESTAMP只存储数量自1970-01-01以来的秒数,它使用4个字节。

您可以在此处阅读更多有关MySQL时间格式之间差异的信息

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

综上所述,Rails实际上为您做出了一些决策。双方:timestamp:datetime会默认为DATETIME,同时,:date:time对应于DATETIME分别。

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


7
作为记录,我更喜欢绝对时间戳(unix),因为YYYY-MM-DD格式取决于所使用的时区。因此,客户端需要知道服务器的时区,并且需要进行转换。自1970年以来的Seconds绝对时间戳不存在该问题。
2012年

32
@ n13很好,但是在Rails中并不是真正的问题,因为它在将日期时间插入数据库之前会转换为UTC。
vonconrad

13
这是Rails领域中最有用的帖子之一。这应该添加到rails指南中……
Andrew

4
MySQL的TIME列并不是严格意义上的“一天中的时间”,因为它接受的时间大于24。它也可以用作“经过时间”。
nickgrim 2013年

6
其他数据库是否也一样?例如postgres?
安迪·海登

24
  1. :datetime(8个字节)

    • 存储格式为YYYY-MM-DD HH:MM:SS的日期和时间
    • 对于诸如birth_date之类的列很有用
  2. :timestamp(4个字节)

    • 自1970-01-01以来存储的秒数
    • 对于诸如updated_at,created_at之类的列很有用
  3. :date(3个字节)
    • 店铺日期
  4. :time(3个字节)
    • 储存时间

3
这更像是上面接受的答案的TL:DR版本
Chidozie Nnachor

0

这是我发现的很棒而又精确的解释。

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

也...

具有不同列“日期”类型和相应的rails迁移类型的表,具体取决于数据库

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.