何时使用datetime或timestamp

时间:2011-05-13 08:59:14

标签: mysql datetime timestamp

我搜索过这个但没有明确的答案(特别是关于后者)。在什么情况下你应该使用日期时间或时间戳?

5 个答案:

答案 0 :(得分:65)

假设您正在使用MS SQL Server(您不是,请参阅下面的更新):

  

一个表只能有一个时间戳   柱。时间戳中的值   列每次更新一次   包含时间戳列的是   插入或更新。这个性质   使时间戳列变差   钥匙的候选人,尤指小学生   键。对该行进行的任何更新   因此,更改时间戳值   改变关键值。如果列   是一个主键,旧的键值   不再有效,外键   引用旧值是否定的   更长的有效。如果表是   全部在动态游标中引用   更新改变了的位置   游标中的行。如果列是   在索引键中,所有更新   数据行也会生成更新   索引。

有关MSDN

的信息

如果您需要针对某一行存储日期/时间信息,并且没有更改该日期/时间,请使用DateTime;否则,请使用时间戳。

另请注意: MS SQL Server时间戳字段不是Dates也不是Times,它们是数据更改时相对序列的二进制表示。

更新

正如你已经更新说MySQL:

  

TIMESTAMP值的转换   UTC的当前时区   存储,并从UTC转换回来   到目前的时区   恢复。 (这只发生在   TIMESTAMP数据类型,不适用于其他类型   类型,如DATETIME。)

来自MySQL Reference

更值得注意的是:

  

如果存储TIMESTAMP值,和   然后更改时区并检索   值,检索值是   与您存储的值不同。

因此,如果您跨时区使用应用程序,并且需要日期/时间来反映单个用户设置,请使用时间戳。如果您需要一致性而不考虑时区,请使用日期时间

答案 1 :(得分:30)

参见Should I use field 'datetime' or 'timestamp'? 它全面覆盖了该主题。

编辑 - 只是总结MySQL的属性和我的经验 -

时间戳 -

a)每列4个字节(与日期时间相比为8)

  • LOWER RANGE('1970-01-01 00:00:01'UTC to'2038-01-09 03:14:07'UTC)比DATETIME - 所以绝对不要将它用于生日等。大多数用法模式实际上是为行更新等活动提供'NOW'的'时间戳'等。

b)内部存储为整数

  • 表现明智......我的个人经历一直模糊不清......有时它的速度更快......有时比DATETIME慢。但它占用的空间更少。

c)有时区信息!

  • 所以 - 如果我在TIMESTAMP中添加'2011-01-01 3:30'(将curr timezone添加为EST - Boston)..稍后,我将更改服务器& mysql时区到PST(加利福尼亚州)并重新启动服务器 - 该值将更改为“2011-01-01 00:00” - (请确认...我很久以前就测试了这个)。但是,DATETIME将保持不变。

d)所有DATE()/ DAY()/ MONTH()函数都适用于TIMESTAMP和DATETIME

e)在MySQL中,每个表可以有多个TIMESTAMPS

  • (是的,但是只有其中一个(第一个)会随着行更新的时间自动更新,也...只有一个可以变成NOT NULL(想想第一个))

f)表格中的第一个TIMESTAMP会自动更新......

  • 所以如果你将它用于其他目的,请小心..并希望在那里允许空值。 (null在DATETIME和TIMESTAMP中存储为'0000-00-00 00:00:00')

我已将多个时间戳用于其他目的..需要节省空间(必须非常小心并记住所有这些问题。

我的建议,只有当你知道自己在做什么时,才会选择TIMESTAMP用于非时间戳目的......如果SPACE是一个非常关注的问题(我的例如 - 15,000,000行和不断增长的8个日期时间!)

答案 2 :(得分:5)

我没有清楚地提出你的问题,但请看下面的链接。它可能对你有帮助

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

答案 3 :(得分:2)

需要指定数据库服务器。

某些服务器引擎会自动更新时间戳字段,因此可以在Optimistic Locking

中用作记录版本

答案 4 :(得分:2)

  • 在MySQL中,在DateTime类型上,您可以使用DATE()相关功能,而在timestamp上则不能。
  • Timestamp无法保留01-01-1970之前的值。
  • 此外,其中一人持有夏令时,其他人则没有(我现在不记得哪一个)

我倾向于总是选择DateTime

相关问题