在我的经验中,编程时正确处理日期/时间总是充满危险和困难。
对我来说,Ruby和Rails一直是个难题,因为它们提供了很多选项;我从不知道该选择哪一个。
当我使用Rails并查看ActiveRecord数据类型时,我可以找到以下几种:
:datetime、:timestamp、:time和:date
但我不知道它们之间的区别或可能存在的问题。
它们的区别是什么?你如何使用它们?
(注:我正在使用Rails3)
在我的经验中,编程时正确处理日期/时间总是充满危险和困难。
对我来说,Ruby和Rails一直是个难题,因为它们提供了很多选项;我从不知道该选择哪一个。
当我使用Rails并查看ActiveRecord数据类型时,我可以找到以下几种:
:datetime、:timestamp、:time和:date
但我不知道它们之间的区别或可能存在的问题。
它们的区别是什么?你如何使用它们?
(注:我正在使用Rails3)
DATETIME
和TIMESTAMP
之间的区别有些微妙: DATETIME
格式为YYYY-MM-DD HH:MM:SS
。有效范围从1000年到9999年(以及其中的每一年)。虽然当您从数据库中获取TIMESTAMP
时,它看起来很相似,但它实际上只是unix timestamp的一个前端。其有效范围从1970年到2038年。除了数据库引擎内的各种内置函数之外,这里的区别在于存储空间。因为DATETIME
存储年、月、日、小时、分钟和秒中的每个数字,所以它总共使用8个字节。由于TIMESTAMP
仅存储自1970-01-01以来的秒数,因此它使用4个字节。DATETIME
。TIMESTAMP
。DATE
。TIME
。说了这么多,Rails实际上已经为你做出了一些决策。无论是 :timestamp
还是 :datetime
,默认都使用 DATETIME
,而 :date
和 :time
分别对应于 DATE
和 TIME
。
这意味着在Rails中,你只需要决定是否需要存储日期、时间或两者都需要即可。
TIME
列不仅仅是严格意义上的“一天中的时间”,因为它可以接受大于24小时的数值,也可用作“经过的时间”。 - nickgrim:datetime (8 bytes)
:timestamp (4 bytes)
我发现下面这篇文章对于时间戳和日期时间的解释十分准确:
时间戳(TIMESTAMP)用于跟踪记录的更改,并在记录更改时每次更新。日期时间(DATETIME)用于存储特定且静态的值,该值不受记录中任何更改的影响。
时间戳还受到与不同时区相关的设置的影响。日期时间是恒定的。
时间戳内部将当前时区转换为协调世界时(UTC)进行存储,并在检索期间将其转换回当前时区。日期时间无法实现此功能。
时间戳占4个字节,而日期时间占8个字节。
时间戳支持范围:从“1970-01-01 00:00:01” UTC到“2038-01-19 03:14:07” UTC。日期时间支持范围:从“1000-01-01 00:00:00”到 “9999-12-31 23:59:59”。
此外...
ActiveRecord
类型与 Ruby 类型不对应(例如DateTime
),而 Rails 层在其上甚至添加了其他类型(例如TimeWithZone
)。 - Christopher Oezbek