sql >> Database >  >> RDS >> Mysql

mysql herstel ongeldige datums

Het lijkt erop dat uw foutmelding afkomstig is van uw MySQL-client, niet van de server. Dus het instellen van de server-strikte modus zal je niet helpen deze datums weer te geven met deze client.

Het lijkt erop dat je data in de stijl van 2012-09-31 of 2013-02-29 in je gegevens hebt. Ze zijn correct geformatteerd, maar verder zijn ze verkeerd. In eerdere 5.0.2-versies van MySQL werden deze niet correct betrapt bij het invoeren van uw gegevens. Stel nu uw server in op ALLOW_INVALID_DATES kokhalst ze niet, maar converteert ze in plaats daarvan naar '0000-00-00'. En de klant maakt er grappen over.

Uw eerste stap om dit op te ruimen, is het identificeren van de gewraakte rijen. Je zou dit kunnen proberen.

Schakel eerst ALLOW_INVALID_DATES in

Voer vervolgens deze query uit om rond te kijken in uw tabel. Gebruik SELECT * niet

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

Probeer uit de resultatenset te achterhalen welke datums onzin zijn. Ze kunnen als eerste in deze select-verklaring worden geplaatst, maar je zult een beetje moeten zoeken om ze te vinden.

Zoek vervolgens uit hoe u ze wilt repareren. De rijen verwijderen? De datum wijzigen in 1941-12-07 (de datum die in schande leeft)? We kunnen je hier niet vertellen wat je moet doen.

Repareer ze dan. Als er maar één of twee zijn, repareer ze dan één voor één.

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

of

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

Als het er duizenden zijn, kun je ze in bulk repareren met zoiets als dit. Maar doe dit niet zonder eerst het probleem heel zorgvuldig op een testserver uit te werken. Als je een fout maakt, vernietig je je tafel.

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

Nadat u klaar bent met het oplossen van uw problemen, gaat u terug en doet u uw SELECT * , om er zeker van te zijn dat je ze allemaal hebt.

Schakel vervolgens ALLOW_INVALID_DATES uit en schakel het nooit meer opnieuw in.

Dat zou de rommel moeten opruimen. Merk op dat real-world gegevens altijd enkele rijen bevatten die er niet perfect in staan.




  1. SQL Server :geeft NEWID() altijd een unieke ID?

  2. Hoe te ontsnappen aan het letterlijke procentteken wanneer de optie NO_BACKSLASH_ESCAPES is ingeschakeld?

  3. Hoe PostgreSQL-database profileren?

  4. Hoe zoek ik vanuit het veld serialisatie in de mysql-database?