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

Posted

技术标签:

【中文标题】Python MySQLdb 日期时间值不正确:\'2018-03-25 02:00:02\'【英文标题】:Python MySQLdb Incorrect datetime value: '2018-03-25 02:00:02'Python MySQLdb 日期时间值不正确:'2018-03-25 02:00:02' 【发布时间】:2018-09-11 15:07:02 【问题描述】:

我在 Python 上使用 mysqlclient 包的 MySQLdb 时遇到此错误。

_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']))

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

数据库中的字段是一个时间戳字段,它适用于其余的日期时间对象,但不知道为什么当它试图使该语句崩溃时。

提前致谢。

【问题讨论】:

您是否可以访问执行的原始 sql 语句? mysql date/datetime 上的操作很少,会根据您拥有的 mysql 版本生成错误。看看this 问题线程。 【参考方案1】:

中欧时间在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'));

有了这个俗气的表定义:

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')));

最好的办法是弄清楚你是如何得出这个无效的日期/时间值的,然后纠正你的错误。您的第二个最佳选择是这个 hack。

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

【讨论】:

我来自西班牙,我从运行在 docker 镜像(官方 mysql docker 镜像,没有任何特定配置)中的 MySQL 获取行并将它们插入到使用西班牙时区运行的本地 MySQL 中。 (格林威治标准时间 +1)

以上是关于Python MySQLdb 日期时间值不正确:'2018-03-25 02:00:02'的主要内容,如果未能解决你的问题,请参考以下文章

日期时间值不正确 数据库错误号:1292

日期时间格式无效:1366 字符串值不正确

尽管行是时间戳,但 SQL 声称日期时间值不正确

SQL DML:日期值不正确 (MySQL)

带有消息“SQLSTATE [22007]”的未捕获异常“PDOException”:日期时间格式无效:1366 字符串值不正确

#1411 - INSERT INTO...SELECT 上函数 str_to_date 的日期时间值不正确