提问



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


如果仅仅由于绝大多数的选择,Ruby和Rails总是在这个问题上找不到我;我从来不知道应该选哪个。


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



  :datetime,:timestamp,:time和:date



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


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


(P.S.我使用Rails3)

最佳参考


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


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


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


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


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


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


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


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

其它参考1



  1. :datetime(8字节)



    • 存储日期和时间格式YYYY-MM-DD HH:MM:SS

    • 对于像birth_date
    • 这样的列很有用

  2. :时间戳(4个字节)



    • 存储自1970-01-01以来的秒数

    • 对updated_at,created_at
    • 等列很有用

  3. :日期(3个字节)


    • 商店日期


  4. :时间(3个字节)


    • 存储时间