何时使用datetime或timestamp

Jam*_* P. 71 mysql datetime timestamp

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

Jay*_*ymz 66

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

一个表只能有一个时间戳列.每次插入或更新包含时间戳列的行时,都会更新timestamp列中的值.此属性使时间戳列成为键的不良候选者,尤其是主键.对该行进行的任何更新都会更改时间戳值,从而更改键值.如果列位于主键中,则旧键值不再有效,并且引用旧值的外键不再有效.如果在动态游标中引用该表,则所有更新都会更改游标中行的位置.如果列位于索引键中,则对数据行的所有更新也会生成索引的更新.

有关MSDN的信息

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

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

更新

正如你已经更新说MySQL:

TIMESTAMP值从当前时区转换为UTC以进行存储,并从UTC转换回当前时区以进行检索.(这仅适用于TIMESTAMP数据类型,而不适用于其他类型,例如DATETIME.)

MySQL参考引用

更值得注意的是:

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

因此,如果您跨时区使用应用程序,并且需要日期/时间来反映单个用户设置,请使用时间戳.如果无论时区如何都需要一致性,请使用Datetime

  • 种类,它们在存储之前转换为UTC,然后在检索时转换回当前时区设置.因此,如果时区设置在存储和检索之间发生变化,您将获得不同的值; 虽然仍然对应于相同的UTC日期时间. (4认同)

Jai*_*Jai 30

请参阅我应该使用字段'datetime'还是'timestamp'? 它全面覆盖了该主题.

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

时间戳 -

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

  • 较低的范围('1970-01-01 00:00:01'UTC到'2038-01-09 03:14:07'UTC)比DATETIME - 所以绝对不要将它用于生日等.大多数使用模式是实际上为行更新等活动提供了"NOW"的"时间戳"等.

b)内部存储为整数

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

c)有时区信息!

  • 所以 - 如果我在TIMESTAMP中添加'2011-01-01 3:30'(用curr timezone作为EST - 波士顿)..稍后,我将服务器和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个日期时间!))


Bhu*_*kar 5

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

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