我遇到了一个非常奇怪的问题,并且不明白这一点。
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可以解决问题,但当然不是一个真正的解决方案。
答案 0 :(得分:4)
这些日期时间看起来很像美国时区的无效值,可以观察夏令时调整。
在3月的一个星期天早上,夏令时时间"向前弹"一小时,有效地在凌晨2点到凌晨3点之间跳过了一小时。凌晨2点到凌晨3点之间的小时不存在,因此指定小时的值不是正确的"值。
您观察到的行为是预期的行为。
请注意,这些值在UTC' time_zone = + 0:00'或在没有观察夏令时的时区中有效。
(另请注意,相反的问题发生在秋季,当时钟"后退"一小时;然后有两个不同的小时,在凌晨2点到凌晨3点之间,具有相同的编码值,但在时区.02:30 CST vs 02:30 CDT)
答案 1 :(得分:0)
夏令时。
In 2011, daylight savings time于3月13日凌晨2点开始。因此,在凌晨2点到凌晨3点之间的任何时间都无效。
MySQL不在严格模式下时会发出警告。如果设置了STRICT_ALL_TABLES
或STRICT_TRANS_TABLES
,则可以通过发布来取消设置所有sql模式,但应注意不建议这样做。
SET @@sql_mode='';
insert into test (time) values("2011-03-13 02:08:04");
您仍会收到有关无效时间戳的警告,并且值2011-03-13 03:00:00
将插入到您的表格中。