在 DATETIME 和 TIMESTAMP 之间同步

Posted

技术标签:

【中文标题】在 DATETIME 和 TIMESTAMP 之间同步【英文标题】:Synchronizing between DATETIME and TIMESTAMP 【发布时间】:2013-04-15 16:56:24 【问题描述】:

正如Should I use field 'datetime' or 'timestamp'? 明确指出的那样,DATETIME 和 TIMESTAMP 字段之间的主要区别是:

    mysql 中的 TIMESTAMP 一般用于跟踪记录的更改,并在每次记录更改时自动更新。 DATETIME 表示日期(在日历中)和时间(可以在挂钟上观察到),而 TIMESTAMP 表示明确定义的时间点。 只有 TIMESTAMP 值会从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。

所以,我有一个包含 date_created 列和 date_modified 列的表。我将 date_created 设为 DATETIME,因此每次更新记录时都不会被覆盖,并将 date_modified 设为 TIMESTAMP,因此每次更新记录时都会更新。

如何保持两者同步?例如,在最初创建记录后,date_created 和 date_modified 列将是相同的。以后如果记录从未更改,则无论时区和夏令时如何,它们都应该保持不变,不是吗?

【问题讨论】:

【参考方案1】:

您列表中的第 1 点并不完全正确。 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 是可以应用于 TIMESTAMP 字段的选项(现在在 5.6 中也是 DATETIME 字段)。它们不是TIMESTAMP 的固有属性。如果您使用的是 5.6 之前的版本,您可能应该对这两个字段都使用 TIMESTAMP

CREATE TABLE my_tbl
  (date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
   date_modified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)

date_created 将在记录创建时获取当前时间戳,而 date_modified 将在记录更新时设置为当前时间戳(您可以在更新中使用 date_modified = date_modified 来防止这种情况发生)。

如果您使用的是 MySQL 5.6,则可以使用 DATETIME 并获得相同的行为。

见http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

【讨论】:

谢谢安德鲁。听起来关键是要使它们具有相同的类型。如果我希望用户看到该值(即我显示“John Doe 最后更新时间为 2013 年 5 月 5 日下午 12:00”),最好使用时间戳或日期时间? 你确定吗?我试了一下,得到:#1293 - 表定义不正确;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列 对于 5.5,我认为您的解决方案不会起作用:表中的一个 TIMESTAMP 列可以将当前时间戳作为初始化列的默认值,作为自动更新值,或两者兼有.不能让当前时间戳成为一列的默认值,而另一列的自动更新值。 对不起-它在最新版本上对我有用。请参阅此处***.com/questions/4489548/…,了解有关#1293 解决方案的一些想法。 别担心!计划升级到 5.6。

以上是关于在 DATETIME 和 TIMESTAMP 之间同步的主要内容,如果未能解决你的问题,请参考以下文章

在 datetime 和 Pandas Timestamp 对象之间转换

datetime,Timestamp和datetime64之间转换

datetime和timestamp的区别

datetime和timestamp的区别是啥?

MySQL中datetime和timestamp的区别

mysql中datetime与timestamp的比较