2017-05-12 6 views
0

Ich möchte einen Tabellensatz in eine andere Tabelle einfügen. Ich wähle Benutzer-ID, Datum und Varianz. Wenn ich die Daten von einem Benutzer einfüge, funktioniert es gut, aber wenn ich mehrere Datensätze einfüge gibt es einen Fehler von SQL Error [1292] [22001]: Data truncation: Truncated incorrect time value: '841:52:24.000000'.einen Tabellensatz in eine andere Tabelle einfügen

insert into 
features.Daily_variance_of_time_between_calls(
uId, 
date, 
varianceBetweenCalls) 

SELECT 
    table_test.uid as uId, 
    SUBSTRING(table_test.date, 1, 10) as date , 
    VARIANCE(table_test.DurationSinceLastCall) as varianceBetweenCalls #calculating the vairiance of inter-event call time 

    FROM 
    (SELECT 
     id,m.uid, m.date, 
     TIME_TO_SEC(
      timediff(m.date, 
      COALESCE(
       (SELECT p.date FROM creditfix.call_logs AS p 
        WHERE 
         p.uid = m.uid 
        AND 
         p.`type` in (1,2) 
        AND 
         (p.id < m.id AND p.date < m.date) 
        ORDER BY m.date DESC, p.duration 
        DESC LIMIT 1), m.date)) 
     ) AS DurationSinceLastCall, 
     COUNT(1) 
    FROM 
     (select distinct id, duration, date,uid from creditfix.call_logs as cl) AS m 

    WHERE 
     m.uId is not NULL 
    AND 
     m.duration > 0 
# AND 
#  m.uId=171 
    GROUP BY 1,2 
    ) table_test 
GROUP BY 1,2 

Wenn ich den Kommentar entfernen, funktioniert es gut für einen bestimmten Benutzer.

+0

Bitte sehen Sie sich Ihre Daten genau an. Fehler schlägt vor, dass die Ausgabe Ihrer SELECT-Anweisung inkompatibel ist und vor allem der Zeitteil abgeschnitten wird. – DhruvJoshi

+0

Ändere den Kommentar mit '-' anstelle von '#', ich denke, es verursacht ein Problem. – Susang

+0

@Suraz Keine Ausgabe von Kommentaren, die immer noch den gleichen Fehler ergeben. –

Antwort

0

Beginnen wir mit der Fehlermeldung starten:

Datenabschneide: Abgeschnitten falsche Zeitwert: ‚841: 52: 24,000000‘

Diese Meldung deutet darauf hin, dass MySQL irgendwann in eine läuft Wert, den es nicht in eine date/time/datetime konvertieren kann. Die Bemühungen zur Isolierung des Problems sollten daher mit einem Fokus darauf beginnen, wo Werte in diese Datentypen konvertiert werden.

Ohne die Datentypen aller verwendeten Felder zu kennen, ist es schwierig zu sagen, wo das Problem wahrscheinlich liegt. Sobald wir jedoch wussten, dass die Abfrage auf eigene Faust ohne Beanstandung lief, wussten wir auch, dass das Problem bei einer Konvertierung während des Einfügens selbst liegen musste. Etwas in den ausgewählten Daten war kein gültiges Datum, sondern wurde in ein Datumsfeld eingefügt. Obwohl Daten und Zeiten und beteiligt an Ihrer Berechnung von varianceBetweenCalls, variance selbst gibt einen numerischen Datentyp zurück. Daher leitete ich ab, dass das Problem mit den von SUBSTRING(table_test.date, 1, 10) zurückgegebenen Daten sein musste, die in das Feld date eingefügt wurden.

Laut den Kommentaren erwies sich dies als richtig. Sie können die schlechten Daten auszuschließen und damit der Einsatz durch Hinzufügen der Klausel arbeiten:

WHERE 
table_test.date NOT LIKE '841%' 
AND table_test.DurationSinceLastCall NOT LIKE '841%' -- I actually think this line is not required. 

Alternativ können Sie abrufen nur die schlechten Daten (mit Blick auf deren Befestigung), indem Sie die INSERT entfernen und mit der Klausel

WHERE 
table_test.date LIKE '841%' 
OR table_test.DurationSinceLastCall LIKE '841%' -- I actually think this line is not required. 

oder besser

SELECT * 
FROM creditfix.call_logs m 
WHERE m.date LIKE '841%' 

Allerdings bin ich der Datentyp des Feldes nicht sicher, so dass Sie, um es wie diese benötigen:

SELECT * 
FROM creditfix.call_logs m 
WHERE SUBSTRING(m.date,10) LIKE '841%' 

Sobald Sie die beanstandeten Daten zu korrigieren, sollten Sie in der Lage sein, die „fix“ aus dem INSERT/SELECT Aussage zu entfernen, obwohl es klug wäre, zu untersuchen, wie die schlechten Daten in das System bekamen.

+0

Ich habe versucht, oben genannte Anweisung 'SELECT * VON crowdfix.call_logs m WHERE SUBSTRING (m.date, 10) WIE '841%' ' , aber es gibt mir keine Aufzeichnung. –

+0

Vielleicht ist es schließlich der DurationSinceLastCall ... der mir immer noch seltsam vorkommt. Was abgerufen wird, wenn Sie das Original wählen Sie (ohne Einsatz), aber unter Verwendung WHERE table_test.date LIKE ‚841%‘ OR table_test.DurationSinceLastCall LIKE ‚841%‘ ' –

+0

es mir eine leere Tabelle gibt –

Verwandte Themen