Python MySQLdb不正确的日期时间值:' 2018-03-25 02:00:02'

时间:2018-04-02 11:39:45

标签: python mysql datetime timezone dst

我使用mysqlclient软件包的MySQLdb在Python上收到此错误。

_mysql_exceptions.OperationalError: 
(1292, "Incorrect datetime value: '2018-03-25 02:00:02' for column 'start' at row 1")

导致错误的代码:

conn.cursor.execute(query.format(table=table), 
(row['id'], row['type'], row['start'], row['end'],       
row['raw_xml'], row['id_parent'], row['rango']))

我可以正确插入其余行,但是当我尝试插入此datetime对象时,它会崩溃。

数据库中的字段是一个时间戳字段,它与其他日期时间对象一起工作,但不知道为什么它试图使这个语句崩溃。

提前致谢。

1 个答案:

答案 0 :(得分:7)

中欧时间在当地时间2018-03-25 02:00从标准时间切换到白昼时间。

这很可能是标准时间到白天时间切换当天的时区转换错误。从0200到0300之前的小时不存在。您的时间价值2018-03-25 02:00:02在中欧时间不存在。

这会让你2018-03-25 03:00:00

SET time_zone = 'Europe/Madrid';
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP('2018-03-25 02:30'));

使用这个cheezy表定义:

CREATE TABLE timetest (
    id INT NOT NULL AUTO_INCREMENT,
    ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX `PK` (`id`)
);

运行此INSERT可以获得不正确的DATETIME值错误。

INSERT INTO timetest (ts) VALUES ('2018-03-25 02:30');

但运行此hack正常工作并将03:00放入表中。

INSERT INTO timetest (ts) VALUES (FROM_UNIXTIME(UNIX_TIMESTAMP('2018-03-25 02:30')));

最好的办法是找出你如何提出无效的日期/时间值,并纠正错误。你的第二个最好的选择是这个黑客。

您还可以将TIMESTAMP列更改为DATETIME列,并以当地时间存储所有时间戳。