2017-08-03 1 views
0
DATE_SUB() Ergebnis

Ich habe die folgende Abfrage in Ordnung zu ignorieren auf eindeutigen Schlüssel arbeiten:INSERT macht ungültig REPLACE Schalt

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

Sobald ich die Abfrage REPLACE oder ON DUPLICATE KEY UPDATE bekomme ich folgende Fehler wechseln:

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

ich unter Stand, das eingehende Wert Format nicht kompatibel mit MySQL Datetime-Spalte ist, aber es scheint nicht ein Problem auf meinem ersten INSERT zu sein.

Irgendwelche Ideen zu was ich vermisse?

Hier ist eine SQL-Geige, aber das Panel wird die DDL/DML so erwarte nicht, dass viel mehr als ein Schema nicht ausgeführt: http://sqlfiddle.com/#!9/656a3/2

Edit: Hier ist zeigt die Arbeits SQLfiddle die replizierte Fehler: http://sqlfiddle.com/#!9/c13f45/1

+0

Haben Sie versucht, Ihre Abfrage vor dem Einfügen als Select-Anweisung auszuführen? Ich mache das, wenn ich debugge und manchmal ist es sehr hilfreich bei der Identifizierung, warum etwas fehlschlägt. – ttallierchio

+0

@ttallierchio SELECT mit der Formatierung DATE_SUB funktioniert gut. – Jared

+0

Schreiben Sie Ihre DML auf der linken Seite: http://sqlfiddle.com/#!9/c13f45/1 oder verwenden Sie Rexester: http://rextester.com/TENRB4721 –

Antwort

0

also nach etwas herumspielen scheint es ersetzen und einfügen ignorieren anders zu handeln. Die Einfügung schneidet die Daten ab, fügt sie aber immer noch ein. der Ersatz wird einfach regelrecht versagen.

müssen Sie das richtige Datum Zeit Format für diese @eht verwenden.

um ein wenig mehr Informationen zu geben, gibt die Einfüge-Ignorierung eine Warnung über die abgeschnittenen Daten aus. Das Ersetzen löst einen Fehler aus und stoppt die Ausführung.

+1

" Wenn Sie den IGNORE-Modifizierer verwenden, werden Fehler ignoriert, die beim Ausführen der INSERT-Anweisung auftreten. [...] Mit IGNORE wird die Zeile verworfen und kein Fehler auftritt. Ignorierte Fehler können stattdessen Warnungen generieren " [INSERT Syntax] (https://dev.mysql.com/doc/refman/5.5/en/insert.html) –

+0

Interessant, dass 'REPLACE IGNORE' nicht für dasselbe Ergebnis aufgerufen werden kann. – Jared

+0

Paul ist richtig, es sagt nur, dass es ein Problem gibt. Nach dem Überprüfen der Dokumentation erscheint jedoch keine Ersetzungs-Ignorierung. habe auch gerade die neueste Version von meinem sql ausprobiert. – ttallierchio

0

'INSERT IGNORE' war in der Lage, die Warnung zu ignorieren und die Einfügung mit dem richtig formatierten datetime abzuschließen.

REPLACE war nicht in der Lage fehlerhafte Zeitstempel zu ignorieren und würde den Fehler verursachen:

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

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

Die Lösung Einwickeln des eingehenden Zeitstempel mit FROM_UNIXTIME() Analyse und Reorganisation der Zeitstempel wie folgt beteiligt

Die funktionierende REPLACE Abfrage ist hier gezeigt:

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

http://rextester.com/GWMW94371 –

+0

@PaulSpiegel Aktualisiert meine Antwort mit Abfrage ausgeführt und erwartete Daten eingefügt. – Jared

Verwandte Themen