2017-08-03 139 views
0

我有以下查询工作的罚款无视唯一关键:一旦切换INSERT到更换DATE_SUB()结果无效

insert_post = ("""INSERT IGNORE INTO posts 
       SET internal = %s, 
        schedule_date = DATE_SUB(%s, INTERVAL 2 HOUR) 
       """) 

我切换查询REPLACEON DUPLICATE KEY UPDATE我收到以下错误:

mysql.connector.errors.DataError: 1292 (22007): Truncated incorrect datetime value: '2017-08-19T12:45:00-0500' 

我认为传入的值格式与MySQL datetime列不兼容,但它似乎不是我的初始INSERT上的问题。

关于我失踪的任何想法?

下面是一个SQL小提琴,但小组不会运行DDL/DML所以不要指望比模式更:http://sqlfiddle.com/#!9/656a3/2

编辑:这里的工作SQLfiddle显示复制错误:http://sqlfiddle.com/#!9/c13f45/1

+0

您是否尝试在插入前将您的查询作为select语句运行?我这样做,当我调试,有时它的超级有助于确定为什么失败。 – ttallierchio

+0

@ttallierchio SELECT和DATE_SUB格式可以正常工作。 – Jared

+0

在左侧写上您的DML:http://sqlfiddle.com/#!9/c13f45/1或使用rexester:http://rextester.com/TENRB4721 –

回答

0

所以经过一番玩耍之后出现了替换和插入忽略的不同行为。该插入将截断数据,但仍插入。替换将彻底失败。

您将不得不为这个@eht使用正确的日期时间格式。

给予更多信息插入忽略抛出数据被截断警告。替换会引发错误并停止执行。

+1

“如果使用IGNORE修饰符,则会忽略执行INSERT语句时发生的错误[...]使用IGNORE时,该行将被丢弃并且不会发生错误,忽略的错误可能会生成警告, [INSERT语法](https://dev.mysql.com/doc/refman/5.5/en/insert.html) –

+0

有趣的是,对于相同的结果,不能调用REPLACE IGNORE。 – Jared

+0

保罗是正确的,它只是告诉你有一个问题。但在检查完文档后,并没有出现替换忽略的情况。也只是尝试了我的SQL的最新版本。 – ttallierchio

0

'INSERT IGNORE'能​​够忽略抛出的警告,并以正确格式化的datetime完成插入操作。

REPLACE无法忽视畸形时间戳,并会导致错误:

mysql.connector.errors.DataError: 1292 (22007): Truncated incorrect datetime value: '2017-08-19T12:45:00-0500' 

的解决方案涉及 FROM_UNIXTIME() 解析包装传入的时间戳和重组这样的时间戳:

schedule_date = datetime.datetime.strptime(item['scheduleDate'], "%Y-%m-%dT%H:%M:%S-%f") # 2017-06-27T08:30:00-0500 -> # 2017-06-27T08:30:00.050000 
formatted_schedule_date = schedule_date.strftime('%Y-%m-%d %H:%M:%S') 

工作REPLACE查询显示在这里:

INSERT IGNORE INTO posts 
       SET internal = 1, 
        schedule_date = DATE_SUB(%s, INTERVAL 2 HOUR) 
+0

http://rextester.com/GWMW94371 –

+0

@PaulSpiegel更新我的答案,执行查询并插入预期数据。 – Jared