2009-08-19 9 views
2

Ich habe ein String-Feld in Mysql (Datumsfelder aus von MSSQL importiert) und ich bin mit dem nach dem String-Wert zu konvertieren und in einem neuen (MYSQL) Datum-Zeit-Feld zu platzieren,Mysql falsches Datum (Daten) in String-Feld wie zu finden/zu validieren?

aktualisieren Table_name Set STATUS_DATE = STR_TO_DATE (SUBSTRING_INDEX (SSTATUS_DATE,““, 1), '% c /% e /% Y'),

irgendwo in der Tabelle I schlechte Daten haben und die Abfrage beendet und SO die Ergebnisse umkehrt I weiß nicht, wie man den schlechten Datensatz findet, um ihn "zu reparieren" Ideen? Ich möchte nur eine einfache Abfrage durchführen, um festzustellen, welcher Datensatz nicht konvertiert wird? Die Fehlermeldung besagt, dass CABANA ist kein Datum, duh, ich vermute, dass der Substr Index ist durcheinander, so dass ich Daten aus dem vorherigen oder folgenden Feld, aber ich weiß nicht, und ich weiß nicht, wie Sie abfragen für schlechte Daten? dh das, was die Umwandlung nicht bestehen wird?

+0

Können Sie den Verbatim-Fehler posten? Wenn ich STR_TO_TIME ('CABANA', '% c /% e /% Y') unter einem frühen 5er-MySQL auswähle, bekomme ich 'NULL' und eine Warnung (kein Fehler), welcher Warntext nicht derselbe ist als deine Erzählung. – pilcrow

+0

Ist das Feld STATUS_DATE als NOT NULL definiert? Ich habe verschiedene Formen der Eingabe für die Funktion "str_to_date" ausprobiert und kann sie nicht zum Fehlschlagen bringen. Datensätze, die nicht analysiert werden können, werden einfach als NULL zurückgegeben. –

Antwort

2

Sie könnten versuchen, so etwas wie

SELECT ID, SSTATUS_DATE von TABLE_NAME WHERE NOT (SUBSTRING_INDEX (SSTATUS_DATE,““, 1) REGEXP ‚^ [0-9] +/[0-9] +/[0 -9] + $ ');

Dies würde Ihnen alle Zeilen geben, die nicht dem 00/00/00 Format folgen.

+0

Ich denke, das ist, was ich suche Ich stimme den anderen Plakaten zu, dass ich "nicht" den Fehler bekommen sollte, wie sie beschreiben, aber ich bekomme es, also werde ich es versuchen und antworten! – dartdog

+0

Große Antwort! Ich war irgendwie der Meinung, dass ein Regex Select der richtige Weg war, wusste aber nicht wie! Vielen Dank!! – dartdog

0

Sie könnten die folgende UDF in einer WHERE-Klausel in Ihrer Update-Anweisung verwenden.

CREATE FUNCTION IsDate (str VARCHAR(256)) 
    RETURNS INT 
BEGIN 
    DECLARE result INT; 

    IF (SELECT LENGTH(DATE(str)) IS NULL) THEN 
     SET result = 0; 
    ELSE 
     SET result = 1; 
    END IF; 

    RETURN tp; 
END