2017-08-03 137 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