ChatGPT解决这个技术问题 Extra ChatGPT

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

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

Ruby 和 Rails 在这个问题上总是让我望而却步,哪怕只是因为有太多的选择;我从来不知道我应该选择哪个。

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

:datetime、:timestamp、:time 和:date

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

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

(PS我正在使用Rails3)

我认为部分混淆还在于 ActiveRecord 类型不对应于 Ruby 类型(例如 DateTime)和 Rails 层甚至其他类型(例如 TimeWithZone)。

C
Christopher Oezbek

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

以 MySQL 为例(如果没有其他原因,因为它最流行),您有 DATEDATETIMETIMETIMESTAMP 列数据类型;就像您有 CHARVARCHARFLOATINTEGER

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

DATETIMETIMESTAMP 之间的区别有点微妙: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 分别对应于 DATETIME

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


作为记录,我更喜欢绝对时间戳(unix),因为 YYYY-MM-DD 格式取决于使用的时区。所以客户端需要知道服务器的时区,并且需要进行转换。 Seconds-since-1970 绝对时间戳没有这个问题。
@n13 好点,但在 Rails 中并不是真正的问题,因为它在将日期时间插入数据库之前转换为 UTC。
这是 Rails 世界中最有用的帖子之一。这应该添加到导轨中...
MySQL 的 TIME 列并不是严格意义上的“一天中的时间”,因为它接受小时 > 24;它也可用作“经过时间”。
这在其他数据库中是否相同?例如postgres?
m
mingca

: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) 存储时间


这更像是上面接受的答案的 TL:DR 版本
C
Community

这是我发现的一个很棒且准确的解释。

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

还...

table with different column "date" types and corresponding rails migration types depending on the database