【问题标题】:MySQL: Trying to insert a value in a timestamp throws an errorMySQL:尝试在时间戳中插入值会引发错误
【发布时间】:2012-03-10 09:08:06
【问题描述】:

我有一个包含此列的表格:

last_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

看起来我无法插入带有自定义时间戳的行,我收到此错误:

不正确的日期时间值:第 1 行的列“last_modified”的“1145868501”

我正在尝试使用来自另一个表的数据填充此表,该表只有一个 creation_time 字段,它是一个 DATETIME,因此我使用 UNIX_TIMESTAMP(creation_time) 来填充时间戳。

我认为带有“DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”的时间戳列阻止我插入自己的东西,对吗?如果是的话,官方文档在哪里,最好的解决方案是什么?先创建一个简单的时间戳,然后在插入数据后更改表?

谢谢!

编辑:由于人们建议我不要使用 UNIX_TIMESTAMP,我不得不说我一开始不想使用它,但我得到了这种错误: 日期时间值不正确:“last_modified”列的“2010-03-28 02:15:51” 所以我想我必须插入一个“真实”的时间戳......

【问题讨论】:

  • 试过没有用creation_time包裹UNIX_TIMESTAMP
  • 其实我先试过了,也没用:-(
  • 发生了什么?怎么没用?
  • 如果你不需要TIMESTAMP的特殊功能何不改成DATETIME呢?
  • 我需要它们,问题是我需要先用现有数据填充此表,然后我声明的时间戳正是我想要的未来数据。否则我觉得它不适用于 2010-03-28 02:15:51 但它适用于 2010-10-11 11:11:11 例如...

标签: mysql timestamp


【解决方案1】:

您可以在TIMESTAMP 列中显式插入一个值。阅读:TIMESTAMP Properties

当行中任何其他列的值从其当前值更改时,自动更新 TIMESTAMP 列(如果有)会自动更新为当前时间戳。如果所有其他列都设置为其当前值,则 TIMESTAMP 列不会更改。如果 TIMESTAMP 列显式分配了除 NULL 以外的值,则自动更新不适用。


更新

呵呵,发生错误是因为 - 好吧 - '2010-03-28 02:15:51' 没有日期时间!这是在夏令时间隔内(通常出现在三月的某一天,在02:00 - 03:0003:00 - 04:00 之间。

参见:Daylight Saving Time 解释。

【讨论】:

  • 您需要知道哪个时区用于存储这些日期时间。
  • 恐怕我必须一一修复这些日期,过去 5 年,该数据库已托管在多台服务器上。无论如何,我不应该有太多行来解决这个问题。感谢所有花时间帮助我的人!
  • MySQL TIMESTAMP 通过仅存储 UTC 值(并根据服务器的时区显示/插入)解决了这个问题。如果您的服务器位于不同的时区,并且您使用的是 DATETIME 列,而不是时间戳,那么您需要分别为单独的服务器转换数据 - 所以您不会得到(加/减)几个小时差异。
  • 无论我遇到多少次与标准/夏令时转换相关的问题,我似乎都会压制它们,直到它们再次发生。谢谢你提醒我,尽管被提醒是多么痛苦。 :)
【解决方案2】:

您正在尝试将长整数放入日期时间字段。那是行不通的。删除对UNIX_TIMESTAMP() 的调用,它应该可以工作。

MySQL TIMESTAMP 类型与DATETIME 几乎相同;它只是有一些额外的自动更新魔法。就 SELECT 和 UPDATE 而言,它是 DATETIME

【讨论】:

  • 不仅是自动更新,还有时区魔法(这是更重要的功能)
  • 是的。但我的观点是它不是 Unix 整数时间戳。 :-)
【解决方案3】:

如果列总是自动更新,您可以从实体中删除属性、getter 和 setter。 这样做,它将在所有查询中被忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多