【发布时间】:2011-08-24 18:37:37
【问题描述】:
我已经搜索过这个但没有明确的答案(尤其是后者)。在什么情况下应该使用日期时间或时间戳?
【问题讨论】:
-
"何时使用日期时间或时间戳?"与“我应该使用字段'datetime'还是'timestamp'?”的含义不同。不知道为什么它被标记为重复。
我已经搜索过这个但没有明确的答案(尤其是后者)。在什么情况下应该使用日期时间或时间戳?
【问题讨论】:
假设您使用的是 MS SQL Server(您不是,请参阅下面的更新):
一张表只能有一个时间戳 柱子。时间戳中的值 每次一行都会更新列 包含时间戳列是 插入或更新。这个性质 使时间戳列变差 键的候选者,尤其是主键 键。对行进行的任何更新 更改时间戳值,从而 改变键值。如果列 在主键中,旧键值 不再有效,外键 引用旧值是否 有效期更长。如果表是 在动态游标中引用,所有 更新改变了位置 游标中的行。如果该列是 在索引键中,所有更新 数据行也生成更新 索引。
MSDN的信息
如果您需要针对一行存储日期/时间信息,并且没有更改该日期/时间,请使用 DateTime;否则,使用时间戳。
另请注意:MS SQL Server 时间戳字段既不是日期也不是时间,它们是数据更改时间的相对顺序的二进制表示。
正如你所说的 MySQL:
TIMESTAMP 值是从 UTC 的当前时区 存储,并从 UTC 转换回来 到当前时区 恢复。 (这仅发生在 TIMESTAMP 数据类型,不适用于其他 DATETIME 等类型。)
更值得注意的是:
如果您存储一个 TIMESTAMP 值,并且 然后更改时区并检索 值,检索到的值为 与您存储的值不同。
因此,如果您跨时区使用应用程序,并且需要日期/时间来反映各个用户的设置,请使用时间戳。如果您需要不考虑时区的一致性,请使用 Datetime
【讨论】:
见Should I use field 'datetime' or 'timestamp'? 它对该主题进行了全面的报道。
编辑 - 只是总结一下 MySQL 的属性和我的经验 -
时间戳 -
a) 每列 4 个字节(相比之下,日期时间为 8 个字节)
b) 内部存储为整数
c) 有时区信息!
d) 所有 DATE() / DAY() / MONTH() 函数都适用于 TIMESTAMP 和 DATETIME
e) 在 MySQL 中,每个表可以有多个 TIMESTAMPS
f) 表中的第一个 TIMESTAMP 会自动更新...
我已将多个时间戳用于其他目的.. 需要节省空间(必须非常小心并牢记所有这些问题。
我的建议是,仅当您知道自己在做什么时才使用 TIMESTAMP 用于非时间戳目的。如果 SPACE 是一个巨大的问题(我的例子 - 15,000,000 行和增长以及 8 个日期时间!))
【讨论】:
我没有清楚地了解您的问题,但请参阅下面的链接。它可以帮助你
http://www.sqlteam.com/article/timestamps-vs-datetime-data-types
【讨论】:
需要指定数据库服务器。
部分服务器引擎会自动更新时间戳字段,因此可以作为Optimistic Locking中的记录版本
【讨论】:
DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP
DateTime 类型可以使用DATE() 相关函数,而timestamp 则不能。Timestamp 不能保存01-01-1970 之前的值。我倾向于总是选择DateTime。
【讨论】: