何时使用date时间或时间戳

我search了这个,但没有明确的答案(特别是后者)。 你应该在什么情况下使用date时间或时间戳?

假设你正在使用MS SQL Server(你没有,请参阅下面更新 ):

一个表只能有一个时间戳列。 每当插入或更新包含时间戳列的行时,时间戳列中的值就会更新。 该属性使时间戳列成为键的一个可能的候选者,特别是主键。 对行进行的任何更新都将更改时间戳值,从而更改键值。 如果该列在主键中,则旧键值不再有效,并且引用旧值的外键不再有效。 如果在dynamic游标中引用表,则所有更新都将更改游标中行的位置。 如果列处于索引键中,则对数据行的所有更新也会生成索引的更新。

有关MSDN的信息

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

另请注意: MS SQL Server时间戳记字段不是date和时间,它们是数据更改时相对顺序的二进制表示forms。

更新

正如你已经更新说MySQL:

将TIMESTAMP值从当前时区转换为UTC存储,并从UTC转换回当前时区以供检索。 (这只发生在TIMESTAMP数据types上,而不是其他types,如DATETIME。

从MySQL参考引用

更值得注意的是:

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

因此,如果跨越时区使用应用程序,并需要date/时间来反映个人用户设置,请使用时间戳。 如果您需要与时区无关的一致性,请使用date时间

请参阅我应该使用字段“date时间”还是“时间戳”? 它有一个关于这个话题的全面报道。

编辑 – 只是为了总结MySQL的属性和我的经验,

时间戳 –

a)每列4字节(date时间为8)

  • 下限('1970-01-01 00:00:01'UTC到'2038-01-09 03:14:07'UTC)比date – 所以绝对不要用它作为生日等大多数使用模式是实际上为行更新等活动提供“NOW”的“Timestamp”。

b)作为整数内部存储

  • 性能明智…我的个人经验一直模棱两可..有时它更快…有时比DATETIME慢。 尽pipe它占用的空间较less。

c)有时区信息!

  • 所以 – 如果我添加'2011-01-01 3:30'在TIMESTAMP(与curr时区EST – 波士顿)..后来,我更改服务器和MySQL时区PST(加州),并重新启动服务器 – 值将改变到'2011-01-01 00:00' – (请确认…我已经testing了很久以前)。 但是,DATETIME将保持不变。

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

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

  • (是的,但是,只有其中一个(第一个)会随着行更新的时间自动更新,也…只有一个可以作出不空(认为第一个))

f)表中的第一个TIMESTAMP被自动更新…

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

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

我的build议是,只有当你知道自己在做什么的时候,才能用TIMESTAMP来实现非时间戳的目的。如果SPACE是一个巨大的问题(例如15,000,000行,增长和8个date时间)

我没有清楚地回答你的问题,但是看下面的链接。 它可能会帮助你

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

需要指定数据库服务器。

一些服务器引擎会自动更新时间戳字段,所以它可以在乐观locking中用作logging版本

  • 在MySQL中,在DateTimetypes上,您可以使用DATE()相关函数,而在timestamp则不能。
  • Timestamp01-01-1970之前不能保存值。
  • 此外,其中一人持有夏令时,其他人则不(我不记得现在哪一个)

我倾向于总是selectDateTime