关于MySQL:何时使用日期时间或时间戳

When to use datetime or timestamp

本问题已经有最佳答案,请猛点这里访问。

我已经搜索过了,但没有明确的答案(尤其是后者)。在什么情况下应该使用日期时间或时间戳?


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

A table can have only one timestamp
column. The value in the timestamp
column is updated every time a row
containing a timestamp column is
inserted or updated. This property
makes a timestamp column a poor
candidate for keys, especially primary
keys. Any update made to the row
changes the timestamp value, thereby
changing the key value. If the column
is in a primary key, the old key value
is no longer valid, and foreign keys
referencing the old value are no
longer valid. If the table is
referenced in a dynamic cursor, all
updates change the position of the
rows in the cursor. If the column is
in an index key, all updates to the
data row also generate updates of the
index.

有关msdn的信息

如果需要根据行存储日期/时间信息,而不需要更改日期/时间,请使用date time;否则,请使用timestamp。

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

更新

当你更新到mysql时:

TIMESTAMP values are converted from
the current time zone to UTC for
storage, and converted back from UTC
to the current time zone for
retrieval. (This occurs only for the
TIMESTAMP data type, not for other
types such as DATETIME.)

引自mysql参考

更值得注意的是:

If you store a TIMESTAMP value, and
then change the time zone and retrieve
the value, the retrieved value is
different from the value you stored.

因此,如果您正在跨时区使用应用程序,并且需要日期/时间来反映各个用户的设置,请使用时间戳。如果不管时区如何,都需要一致性,请使用datetime


看我应该使用字段"datetime"还是"timestamp"?它对这个话题有全面的报道。

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

时间戳-

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

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

b)内部存储为整数

  • 性能方面…我的个人经历是模棱两可的。有时速度更快…有时比日期时间慢。但它占用的空间更少。

c)有时区信息!

  • 所以-如果我在时间戳中添加"2011-01-01 3:30"(当前时区为EST-波士顿)。稍后,我将服务器&mysql时区更改为pst(加利福尼亚)并重新启动服务器-该值将更改为'2011-01-01 00:00'--(请确认…我早就测试过了)。但是,日期时间将保持不变。

d)所有date()/day()/month()函数都适用于timestamp和datetime。

e)在MySQL中,每个表可以有多个时间戳。

  • (是的,但是只有一个(第一个)会随着行更新的时间自动更新,而且…只有一个不能为空(先考虑)

f)表中的第一个时间戳将自动更新…

  • 所以,如果你把它用于其他目的,一定要小心。并且希望在那里允许空值。(在日期时间和时间戳中,空值存储为"0000-00-00 00 00:00:00")

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

我的建议是,只有当你知道你在做什么的时候,你才去寻找非时间戳目的的时间戳。如果空间是一个巨大的问题(例如,15000000行,不断增长,8次约会!)


我没有明白你的问题,但请看下面的链接。它可以帮助你

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


  • 在MySQL中,在DateTime类型上,可以使用DATE()相关的函数,而在timestamp类型上则不能。
  • timestamp不能保存01-01-1970之前的值。
  • 另外,其中一个有日光节约,另一个没有(我现在不记得是哪一个)

我总是选择DateTime


需要指定数据库服务器。

一些服务器引擎将自动更新时间戳字段,因此可以在乐观锁定中用作记录版本。