2009-08-19 10 views
2

J'ai un champ de chaîne dans Mysql (champs de date importés de de MSSQL) et je suis en utilisant ce qui suit pour convertir la valeur de chaîne et le placer dans un nouveau (MYSQL) champ date-heure,Mysql bad date (data) dans une chaîne de caractères comment trouver/valider?

Mise à jour Table_name ensemble STATUS_DATE = STR_TO_DATE (SUBSTRING_INDEX (SSTATUS_DATE, » », 1), '% c /% e /% Y'),

quelque part dans le tableau I ai mauvaises données et la requête arrête et inverse les résultats SO I Je ne sais pas comment trouver le mauvais enregistrement de données pour "réparer" les idées? Je voudrais juste faire une requête simple pour déterminer quel enregistrement ne convertit pas? Le message d'erreur indique que CABANA n'est pas une date, duh, je soupçonne que l'index substr est foiré afin que j'obtienne des données du champ précédent ou suivant, mais je ne sais pas, et je ne sais pas comment interroger pour de mauvaises données? c'est-à-dire celui qui ne passera pas la conversion?

+0

Pouvez-vous poster l'erreur verbatim? Quand je sélectionne STR_TO_TIME ('CABANA', '% c /% e /% Y') sous MySQL 5, je reçois 'NULL' et un avertissement (pas une erreur), quel texte d'avertissement n'est pas le même comme votre récit. – pilcrow

+0

Le champ STATUS_DATE est-il défini comme NOT NULL? J'ai essayé différentes formes d'entrée dans la fonction str_to_date et je n'arrive pas à l'échouer. Les enregistrements qui ne peuvent pas être analysés sont simplement retournés comme NULL. –

Répondre

2

Vous pouvez essayer quelque chose comme

ID SELECT, SSTATUS_DATE de TABLE_NAME OU NON (SUBSTRING_INDEX (SSTATUS_DATE, » », 1) REGEXP «^[0-9] +/[0-9] +/[0 -9] + $ ');

Cela vous donnerait toutes les lignes qui ne suivent pas le format 00/00/00.

+0

Je pense que c'est ce que je cherche Je suis d'accord avec les autres affiches que je "ne devrais pas" obtenir l'erreur comme ils le décrivent mais je l'obtiens donc je vais essayer et répondre! – dartdog

+0

Bonne réponse! Je pensais qu'un regex select était le chemin à suivre, mais je ne savais pas comment! Je vous remercie!! – dartdog

0

Vous pouvez utiliser le fichier UDF suivant dans une clause WHERE dans votre instruction update.

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 
Questions connexes