2017-10-19 19 views
2

J'essaie d'insérer des chaînes VARCHARs qui ne sont pas un format de date valide dans une autre table où elles sont également stockées en tant que VARCHAR. Je suis en train d'utiliser STR_TO_DATE pour ce faire, qui est censé revenir NULL si le format d'une chaîne est invalide:MySQL Impossible d'insérer WHERE STR_TO_DATE IS NULL

INSERT INTO DateErrors 
    SELECT `row_id`,`date_string` 
    FROM `source_table` 
    WHERE STR_TO_DATE(`date_string`,'%d-%m-%Y') IS NULL 

qui renvoie une erreur pour les chaînes avec un format de date non valide: Error Code: 1411. Incorrect datetime value: 'some random string that isnt a date' for function str_to_date. Au lieu de lancer cette erreur, je veux que ces valeurs de chaîne soient insérées dans DateErrors. Toutefois, l'exécution de la requête SELECT renvoie uniquement les lignes où date_string est invalide sans émettre d'erreur.

+0

Pourquoi ne pas simplement 'OÙ DATE_STRING null'? Pas besoin de le formater si vous cherchez des valeurs nulles. – PaulProgrammer

+0

@PaulProgrammer Je pense que c'est sous l'hypothèse que les dates non valides renvoient 'NULL', mais elles peuvent en fait apparaître' 00-00-0000'. – tadman

+0

Vous devriez vraiment vous diriger vers l'utilisation des colonnes 'DATE' et des colonnes * only *' DATE' pour stocker les dates afin d'éviter ce problème en premier lieu. La forme idéale est le format "AAAA-MM-JJ" ou ISO-8601. Tous les autres mènent à l'ambiguïté. – tadman

Répondre

2

Vous spécifiez un format incorrect pour votre chaîne de date dans STR_TO_DATE

STR_TO_DATE(`date_string`,'%d-%m-%Y') 

à la place, il devrait être

STR_TO_DATE(`date_string`,'%Y-%m-%d') 
+0

Je veux insérer des lignes de 'source_table' dans' DateErrors' où 'chaîne_date'' ne correspond pas au format '% d-% m-% Y' – Steven

+0

@Steven Je ne suis pas sûr, qu'est-ce que vous demandez, mais je vous a donné une solution pour votre problème. Vous devez afficher des données pour comprendre votre problème – Ravi