以我的经验,在编程时获得正确的日期/时间总是充满危险和困难。
Ruby 和 Rails 在这个问题上总是让我望而却步,哪怕只是因为有太多的选择;我从来不知道我应该选择哪个。
当我使用 Rails 并查看 ActiveRecord 数据类型时,我可以找到以下内容
:datetime、:timestamp、:time 和:date
并且不知道差异是什么或陷阱潜伏在哪里。
有什么不同?你用它们做什么?
(PS我正在使用Rails3)
ActiveRecord
类型不对应于 Ruby 类型(例如 DateTime
)和 Rails 层甚至其他类型(例如 TimeWithZone
)。
ActiveRecord 中不同日期/时间格式之间的差异与 Rails 几乎没有关系,而与您使用的任何数据库有关。
以 MySQL 为例(如果没有其他原因,因为它最流行),您有 DATE
、DATETIME
、TIME
和 TIMESTAMP
列数据类型;就像您有 CHAR
、VARCHAR
、FLOAT
和 INTEGER
。
所以,你问,有什么区别?好吧,其中一些是不言自明的。 DATE
只存储日期,TIME
只存储一天中的时间,而 DATETIME
两者都存储。
DATETIME
和 TIMESTAMP
之间的区别有点微妙:DATETIME
被格式化为 YYYY-MM-DD HH:MM:SS
。有效范围从 1000 年到 9999 年(以及介于两者之间的所有内容。当您从数据库中获取 TIMESTAMP
看起来相似时,它实际上只是 unix timestamp 的一个前端。它的有效范围从 1970 年到 2038 年。这里的区别,除了数据库引擎中的各种内置函数外,还有存储空间。因为 DATETIME
存储了年、月、日、小时、分钟和秒中的每个数字,它总共用了 8 个字节。由于 TIMESTAMP
只存储自 1970-01-01 以来的秒数,所以它使用了 4 个字节。
您可以阅读有关 MySQL here 中时间格式差异的更多信息。
最后,归结为您需要日期/时间列执行的操作:
您需要存储 1970 年之前或 2038 年之后的日期和时间吗? => 使用日期时间。
您是否需要担心数据库大小并且您在该时间范围内? => 使用时间戳。
你只需要存储一个日期吗? => 使用日期。
你只需要存储一个时间吗? => 使用时间。
说了这么多,Rails 实际上会为您做出其中的一些决定。 :timestamp
和 :datetime
都将默认为 DATETIME
,而 :date
和 :time
分别对应于 DATE
和 TIME
。
这意味着在 Rails 中,您只需决定是否需要存储日期、时间或两者都存储。
:datetime (8 bytes) 存储格式为 YYYY-MM-DD HH:MM:SS 的日期和时间 对于像birth_date 这样的列有用 :timestamp (4 bytes) 存储自 1970-01-01 以来的秒数 对于像 updated_at, created_at 这样的列有用: date (3 bytes) 存储 Date :time (3 bytes) 存储时间
这是我发现的一个很棒且准确的解释。
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'
还...
不定期副业成功案例分享
TIME
列并不是严格意义上的“一天中的时间”,因为它接受小时 > 24;它也可用作“经过时间”。