我搜索过这个但没有明确的答案(特别是关于后者)。在什么情况下你应该使用日期时间或时间戳?
答案 0 :(得分:65)
假设您正在使用MS SQL Server(您不是,请参阅下面的更新):
一个表只能有一个时间戳 柱。时间戳中的值 列每次更新一次 包含时间戳列的是 插入或更新。这个性质 使时间戳列变差 钥匙的候选人,尤指小学生 键。对该行进行的任何更新 因此,更改时间戳值 改变关键值。如果列 是一个主键,旧的键值 不再有效,外键 引用旧值是否定的 更长的有效。如果表是 全部在动态游标中引用 更新改变了的位置 游标中的行。如果列是 在索引键中,所有更新 数据行也会生成更新 索引。
有关MSDN
的信息如果您需要针对某一行存储日期/时间信息,并且没有更改该日期/时间,请使用DateTime;否则,请使用时间戳。
另请注意: MS SQL Server时间戳字段不是Dates也不是Times,它们是数据更改时相对序列的二进制表示。
正如你已经更新说MySQL:
TIMESTAMP值的转换 UTC的当前时区 存储,并从UTC转换回来 到目前的时区 恢复。 (这只发生在 TIMESTAMP数据类型,不适用于其他类型 类型,如DATETIME。)
更值得注意的是:
如果存储TIMESTAMP值,和 然后更改时区并检索 值,检索值是 与您存储的值不同。
因此,如果您跨时区使用应用程序,并且需要日期/时间来反映单个用户设置,请使用时间戳。如果您需要一致性而不考虑时区,请使用日期时间
答案 1 :(得分:30)
参见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个日期时间!)
答案 2 :(得分:5)
我没有清楚地提出你的问题,但请看下面的链接。它可能对你有帮助
http://www.sqlteam.com/article/timestamps-vs-datetime-data-types
答案 3 :(得分:2)
需要指定数据库服务器。
某些服务器引擎会自动更新时间戳字段,因此可以在Optimistic Locking
中用作记录版本答案 4 :(得分:2)
DateTime
类型上,您可以使用DATE()
相关功能,而在timestamp
上则不能。Timestamp
无法保留01-01-1970
之前的值。我倾向于总是选择DateTime
。