【问题标题】:When to use datetime or timestamp [duplicate]何时使用日期时间或时间戳 [重复]
【发布时间】:2011-08-24 18:37:37
【问题描述】:

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

【问题讨论】:

  • "何时使用日期时间或时间戳?"与“我应该使用字段'datetime'还是'timestamp'?”的含义不同。不知道为什么它被标记为重复。

标签: mysql datetime timestamp


【解决方案1】:

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

一张表只能有一个时间戳 柱子。时间戳中的值 每次一行都会更新列 包含时间戳列是 插入或更新。这个性质 使时间戳列变差 键的候选者,尤其是主键 键。对行进行的任何更新 更改时间戳值,从而 改变键值。如果列 在主键中,旧键值 不再有效,外键 引用旧值是否 有效期更长。如果表是 在动态游标中引用,所有 更新改变了位置 游标中的行。如果该列是 在索引键中,所有更新 数据行也生成更新 索引。

MSDN的信息

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

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

更新

正如你所说的 MySQL:

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

引用MySQL Reference

更值得注意的是:

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

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

【讨论】:

  • 感谢您的回复。正在更新的时间戳列究竟是什么意思?这是否意味着列中的所有值都已更改?
  • 这意味着 正在编辑的行 的值将被更改 - 注意:这仅适用于 MS SQL;我已更新答案以包含 MySQL 信息。
  • 好的,感谢您的更新。所以要重新制定,时间戳值会适应时区设置的变化,或者当数据导入到具有不同时区的服务器上时?
  • 一种,它们在存储之前转换为 UTC,然后在检索时转换回当前时区设置。因此,如果时区设置在存储和检索之间发生变化,您将得到不同的值;虽然仍然对应相同的 UTC 日期时间。
  • 听起来是一种合乎逻辑的方法。感谢您的澄清。
【解决方案2】:

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 ) THAN DATETIME - 所以绝对不要将它用于生日等。大多数用法模式实际上是为行更新等活动提供“现在”的“时间戳”。

b) 内部存储为整数

  • 性能方面...我的个人经验一直模棱两可...有时它更快...有时比 DATETIME 慢。不过它占用的空间更少。

c) 有时区信息!

  • 所以 - 如果我在 TIMESTAMP 中添加“2011-01-01 3:30”(当前时区为 EST - 波士顿).. 稍后,我将服务器和 mysql 时区更改为 PST(加利福尼亚)并重新启动服务器 -值将更改为“2011-01-01 00:00”——(请确认……我很久以前就测试过这个)。但是,DATETIME 将保持不变。

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

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

  • (是的,但是只有一个(第一个)会随着行更新的时间自动更新,而且...只有一个可以设为 NOT NULL(想想第一个))

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

  • 因此,如果您将其用于其他目的时要小心.. 并希望在其中允许空值。 (在 DATETIME 和 TIMESTAMP 中存储为 '0000-00-00 00:00:00' 的 null)

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

我的建议是,仅当您知道自己在做什么时才使用 TIMESTAMP 用于非时间戳目的。如果 SPACE 是一个巨大的问题(我的例子 - 15,000,000 行和增长以及 8 个日期时间!))

【讨论】:

  • 谢谢杰。我已经浏览了该主题,但似乎更多的是关于两者之间的技术差异(我将补充相当混乱),而不是它们应该用于什么情况。请参阅未知的回复了解我在寻找什么。
  • @James P. 刚刚添加了我对两者的个人经验
  • c) 点令人困惑。关键是您想使用时间戳,因为它们基于世界各地的单一通用时间;而 DateTimes 只是本地的,因此受制于您所在时区的意见。当前的解释使它向后看。波士顿的 4:30 将转换为加利福尼亚的 1:30,带有时间戳,因为它们实际上是相同的时间。这就是你想要的,尤其是。如果你在做银行业务。使用 DateTimes,不考虑时区信息;所以波士顿的 4:30 也将在加利福尼亚州作为 4:30 给出。哎呀。
【解决方案3】:

我没有清楚地了解您的问题,但请参阅下面的链接。它可以帮助你

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

【讨论】:

    【解决方案4】:

    需要指定数据库服务器。

    部分服务器引擎会自动更新时间戳字段,因此可以作为Optimistic Locking中的记录版本

    【讨论】:

    • 编辑了问题。这是为 MySQL 准备的。
    • 在这种情况下,google first hit 会告诉您TIMESTAMP in mysql offers automatic updating and converts to UTC time,无论连接时区如何。您需要在列创建中明确地 sepcify DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP
    • 好的,所以跨时区使用应用程序时应该使用时间戳。还有其他可以使用的案例吗?
    • 没有。时间戳将用于记录的版本控制。 UTC 转换仅有助于实现这一目的,因此比较总是有效且安全的。你读过维基百科的链接吗?如果你不知道我在说什么,你可能根本不需要这个。您是否使用显式锁定/事务隔离?那就忘了这个
    • 啊,对于应该如何使用它似乎有不同的意见。是的,我了解乐观锁定的概念,不,我不使用任何类似的东西。
    【解决方案5】:
    • 在 MySQL 中,DateTime 类型可以使用DATE() 相关函数,而timestamp 则不能。
    • Timestamp 不能保存01-01-1970 之前的值。
    • 另外,其中一个有夏令时,另一个没有(我不记得现在是哪一个)

    我倾向于总是选择DateTime

    【讨论】:

    • Timestamp 可以保存 1970 年之前的值 - 您只需使用负整数。此外,如果您使用无符号整数,则可以超过 2038。
    猜你喜欢
    • 2013-08-07
    • 2011-09-07
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多