SQL Merkwürder Fehler bei MySQL

Sannyboy111985

Commander
Registriert
März 2003
Beiträge
2.899
Hallo Community,

ich hoffe hier kann mir jemand weiter helfen, auch wenn es kein "echtes" Programmierungs Problem ist. Vielmehr verstehe ich einen SQL Fehler nicht wirklich.

Hintergrund:
Ich habe bei mir eine Openhab Instanz mit MySQL Persistence im Einsatz.
Darin werden regelmäßig Datengespeichert, die ich innerhalb der Datenbank aggregieren möchte, da OpenHab das von sich aus nicht mitbringt.

Problem:
SQL-Befehl:
INSERT INTO Item33 (time, value) VALUES ('16-12-1 0:17:60', 43.37) ;
MySQL meldet: Dokumentation
#1062 - Duplicate entry '0000-00-00 00:00:00' for key 'PRIMARY'

Der Primaray Key '0000-00-00 00:00:00' kommt irgendwo in meinen daten vor!
Code:
$ grep 0000:00 $SQL
$

Ablauf
1. SQL File genereiren
2. cat $SQL | $MYSQL

Aktuelle Daten in DB:
Code:
2016-11-16 03:09:23     43.8
2016-11-16 03:10:53     43.8
2016-11-16 03:12:26     42.5
2016-11-16 03:13:55     43.8
2016-11-16 03:15:33     43.8
2016-11-16 03:17:06     43.8
2016-11-16 03:18:38     43.8
2016-11-16 03:20:15     43.8
2016-11-16 03:21:45     43.8
2016-11-16 03:23:15     43.8
2016-11-16 03:24:44     43.8
2016-11-16 03:26:16     43.8
2016-11-16 03:27:46     43.8
2016-11-16 03:29:20     43.8
2016-11-16 03:30:53     43.8
2016-11-16 03:32:25     43.8
2016-11-16 03:33:59     43.8
2016-11-16 03:35:51     43.8
2016-11-16 03:37:44     43.8
2016-11-16 03:39:13     43.8

Frage:
Hat jemand eine Idee, warum der flasche Primary Key eingefügt wird, obwohl er nicht in meinen Quelldaten steht?
 
Zuletzt bearbeitet:
Halt dich an den Syntax vom Datum!
YYYY-MM-DD

Fehlende Stellen werden mit Nullen aufgefüllt.

1.2.2001 = 2001-02-01
 
Hast du in deinen Quelldaten eine Leere Zeile?
 
Vielen Dank schonmal für die schnellen Antworten.
Gerade gesehen, in den Daten war ein Copy Paste Fehler, habe ich korrigiert.

Hier mal die ersten 500 Zeilen meines SQL Files:




Das mit der Sekunde 60 ist natürlich korrekt, die gibt es in der Regel nicht.
Da war ich wohl mit mem SQL zu blauäugig
Code:
SECS=`$MYSQL -sN -e " SELECT right(round(avg(time),0),2) FROM $ITEM WHERE time BETWEEN '$Y-$M-$D $HOUR:$MIN:00' AND '$Y-$M-$D $HOUR:$MINEND:59'  " `


Mein Ziel ist es den 5 Minuten Mittelwert aus meinen Datensätzen zu ermitteln und diesen zum "mittleren Zeitpunkt" der Datensätzen eintragen. Hoffe das versteht man einigermaßen.
 

Anhänge

Zuletzt bearbeitet:
Die Hinweise mit dem Datumsformat hast du ignoriert? Dein Format ist doch Mist.

Es ist doch offensichtlich, dass das das Problem ist, denn:
Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
http://dev.mysql.com/doc/refman/5.7/en/datetime.html
Und genau das erzählt dir auch deine Fehlermeldung.

Also entweder dafür sorgen, dass du das Datum richtig schreibst oder du teilst MySQL dein Format mit:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
 
Irgendwie war ich gestern Blind und habe die Sekunde 60 übersehen.
Um den Mittelwert über eine Zeit zu bilden ist wohl die Funktion besser geeignet: "SEC_TO_TIME(AVG(TIME_TO_SEC(time)))"
 
Zurück
Oben