在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行的),你有DATE
, DATETIME
, TIME
和TIMESTAMP
列数据types; 就像你有CHAR
, VARCHAR
, FLOAT
和INTEGER
。
所以,你问,有什么区别? 那么,其中一些是不言自明的。 DATE
只存储一个date, TIME
只存储一天的时间,而DATETIME
存储这两个date。
DATETIME
和TIMESTAMP
之间的区别稍微微妙一些: 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
对应于DATE
和TIME
。
这意味着在Rails中,你只需要决定是否需要存储date,时间或两者兼而有之。
-
:datetime(8字节)
- 存储date和时间格式为YYYY-MM-DD HH:MM:SS
- 对于像birth_date这样的列很有用
-
:时间戳(4个字节)
- 存储自1970-01-01以来的秒数
- 对像updated_at,created_at这样的列很有用
- :date(3字节)
- 存储date
- :时间(3个字节)
- 存储时间