Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql corrige les dates invalides

Il semble que votre message d'erreur provienne de votre client MySQL, pas du serveur. Ainsi, définir le mode strict du serveur ne vous aidera pas à afficher ces dates avec ce client.

Il semble que vous ayez des dates de style 2012-09-31 ou 2013-02-29 dans vos données. Ils sont correctement formatés mais sinon ils sont faux. Dans les versions antérieures à 5.0.2 de MySQL, celles-ci n'étaient pas détectées correctement dans vos données. Maintenant, votre serveur, défini sur ALLOW_INVALID_DATES ne les bâillonne pas, mais les convertit plutôt en '0000-00-00'. Et le client se moque d'eux.

Votre première étape pour nettoyer cela consiste à identifier les lignes incriminées. Vous pouvez essayer ceci.

Tout d'abord, activez ALLOW_INVALID_DATES

Ensuite, exécutez cette requête pour parcourir votre table. Ne pas utiliser SELECT *

  SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d') 
    FROM mytable
   ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d') 

Essayez de déterminer à partir du jeu de résultats quelles dates sont des ordures. Ils peuvent être placés en premier dans cette instruction select, mais vous allez devoir vous débrouiller un peu pour les trouver.

Ensuite, déterminez comment vous voulez les réparer. Supprimer les lignes ? Changer la date en 1941-12-07 (la date qui vit dans l'infamie) ? Nous ne pouvons pas vous dire ce que vous devez faire ici.

Ensuite, corrigez-les. S'il n'y en a qu'un ou deux, corrigez-les un par un.

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE id='the id of the offending row.'

ou

  DELETE FROM mytable
        WHERE id='the id of the offending row.'

S'il y en a des milliers, vous pouvez les réparer en masse avec quelque chose comme ça. Mais ne le faites pas sans avoir d'abord résolu le problème avec beaucoup d'attention sur un serveur de test. Si vous faites une erreur, vous supprimerez votre table.

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')

Une fois que vous avez terminé de corriger vos problèmes, revenez en arrière et faites votre SELECT * , pour vous assurer que vous les avez tous.

Puis désactivez ALLOW_INVALID_DATES et ne le réactivez plus jamais.

Cela devrait nettoyer le gâchis. Notez que les données du monde réel contiennent toujours des lignes qui ne sont pas parfaites.