无法将2009-03-08插入时间戳字段

时间:2013-09-27 20:32:25

标签: mysql

鉴于以下表格定义:

CREATE TABLE `timestamp_test` (
  `timestamp_test_id` bigint(18) NOT NULL AUTO_INCREMENT,
  `timestamp_test_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`timestamp_test_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

以下数据:

INSERT INTO `timestamp_test` VALUE (0,'2009-03-09 02:07:01');
INSERT INTO `timestamp_test` VALUE (0,'2009-03-08 02:07:01');

请告诉我为什么我可以插入第一个日期而不是第二个日期?

MySQL版本:5.5

编辑: 我收到的错误是:

[SQL] 
INSERT INTO `timestamp_test` VALUE (0,'2009-03-08 02:07:01');
[Err] 1292 - Incorrect datetime value: '2009-03-08 02:07:01' for column 'timestamp_test_date' at row 1

4 个答案:

答案 0 :(得分:3)

您的查询不正确,应为VALUES

INSERT INTO `timestamp_test` VALUE (0,'2009-03-08 02:07:01');
                                  ^--- missing S

至于为什么您无法插入第二个值,您可以通过插入具有相同标识值的两条记录0来导致主键违规。

答案 1 :(得分:2)

TIMESTAMP数据类型是时区感知的。输入时间从会话的时区转换为UTC,然后再存储为整数,并在SELECT上转换回会话的时区。

在很多时区,没有2009-03-08 02:07:01 ,因为那个早晨的时钟从01:59:59变为03:00:00,您收到此错误,因为您的会话的当前时区是......其中一个时区。

请注意,如果您尝试将此值从/转换为DST观察时区中的同一时区,时间会如何推进。

mysql> SELECT CONVERT_TZ('2009-03-08 02:07:01','EST5EDT','EST5EDT');
+-------------------------------------------------------+
| CONVERT_TZ('2009-03-08 02:07:01','EST5EDT','EST5EDT') |
+-------------------------------------------------------+
| 2009-03-08 03:00:00                                   |
+-------------------------------------------------------+
1 row in set (0.00 sec)

答案 2 :(得分:1)

如果您的第一列是自动递增的,则在插入时无需显式设置:

INSERT INTO timestamp_test(timestamp_test_date) VALUES ('2009-03-09 02:07:01');
INSERT INTO timestamp_test(timestamp_test_date) VALUES ('2009-03-08 03:00:00');

VALUE单数有效,如MySQL文档中所述:http://dev.mysql.com/doc/refman/5.5/en/insert.html

此外,如上所述,由于夏令时在该日期凌晨2点生效,因此日期2009-03-08 02:07:01未在多个时区发生,从而使其成为2009-03-08 03:00:00

答案 3 :(得分:0)

看起来您正在尝试使用相同的主键插入两个记录,并且您在VALUE的位置使用VALUES。更新您的INSERT声明:

INSERT INTO `timestamp_test` VALUES (0, '2009-03-09 02:07:01');
INSERT INTO `timestamp_test` VALUES (1, '2009-03-08 02:07:01');