2

给定下表定义:

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

4 回答 4

3

您的查询不正确,应该是VALUES

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

至于为什么你不能插入第二个值,你通过插入两个具有相同 id 值的记录来导致主键冲突:0

于 2013-09-27T20:34:21.963 回答
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)
于 2013-09-27T21:29:08.350 回答
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

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

于 2013-09-27T20:37:20.660 回答
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');
于 2013-09-27T20:35:22.787 回答