3

我遇到了一个非常奇怪的问题,不明白这一点。

CREATE TABLE test (time TIMESTAMP NOT NULL DEFAULT NOW()) ENGINE=INNODB;

mysql> insert into test (time) values("2011-03-13 01:08:04");
Query OK, 1 row affected (0.00 sec)

这很好。现在,只需将时间更改 1 小时:

mysql> insert into test (time) values("2011-03-13 02:08:04");
ERROR 1292 (22007): Incorrect datetime value: '2011-03-13 02:08:04' for column 'time' at row 1

这里发生了什么?我随机插入日期时间值,发现许多值无法插入:“2011-03-13 02:08:04”、“2010-03-14 02:04:05”、“2009-03-08 02” :24:52”、“2009-03-08 02:48:27”、“2011-03-13 02:06:01”、“2005-04-03 02:00:44”...

将小时改为 1 或将年份改为 1 可以解决问题,但当然不是真正的解决方案。

4

2 回答 2

6

这些日期时间看起来很像观察夏令时调整的美国时区的无效值。

在三月的一个星期天早上,夏令时时钟“向前”一小时,有效地跳过了凌晨 2 点到 3 点之间的时间。凌晨 2 点和凌晨 3 点之间的时间不存在,因此指定该时间的值不是“正确”值。

您观察到的行为是预期的行为。

请注意,这些值在 UTC 'time_zone=+0:00' 或不遵守夏令时的时区中有效。

(另请注意,相反的问题发生在秋季,当时钟“回退”一小时时;然后在凌晨 2 点和凌晨 3 点之间有两个单独的小时,它们具有相同的编码值,但时区不同。02:30 CST vs中部时间 02:30)

于 2014-09-15T20:00:15.623 回答
1

夏令时。

2011 年,夏令时从 3 月 13 日凌晨 2 点开始。因此,凌晨 2 点到 3 点之间的任何时间都是无效的。

MySQL 在非严格模式下会产生警告。如果设置了STRICT_ALL_TABLESSTRICT_TRANS_TABLES,则可以通过发出取消设置所有 sql 模式,但应注意不建议这样做。

SET @@sql_mode='';    
insert into test (time) values("2011-03-13 02:08:04");

您仍然会收到有关无效时间戳的警告,并且该值2011-03-13 03:00:00将插入到您的表中。

于 2014-09-15T19:59:47.350 回答