sql >> Databasteknik >  >> RDS >> Mysql

mysql fix ogiltiga datum

Det ser ut som att ditt felmeddelande kommer från din MySQL-klient, inte från servern. Så att ställa in serverns strikt läge kommer inte att hjälpa dig att visa dessa datum med den här klienten.

Det verkar som om du har några 2012-09-31 eller 2013-02-29 stildatum i din data. De är korrekt formaterade men annars är de fel. I pre 5.0.2 versioner av MySQL fångades dessa inte korrekt när de gick in i dina data. Nu, din server, inställd på ALLOW_INVALID_DATES tar inte munkavle på dem, utan konverterar dem istället till '0000-00-00'. Och klienten tjatar på dem.

Ditt första steg för att rensa upp detta är att identifiera de felande raderna. Du kan prova detta.

Aktivera först ALLOW_INVALID_DATES

Kör sedan den här frågan för att titta runt i din tabell. Använd inte SELECT *

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

Försök att räkna ut från resultatuppsättningen vilka datum som är skräp. De kan placeras först i detta utvalda uttalande, men du måste smutskasta runt lite för att hitta dem.

Ta sedan reda på hur du vill fixa dem. Ta bort raderna? Ändra datumet till 1941-12-07 (datumet som lever i vanära)? Vi kan inte berätta vad du behöver göra här.

Fixa dem sedan. Om det bara finns en eller två, fixa dem en efter en.

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

eller

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

Om det finns tusentals av dem kan du fixa dem i bulk med något sånt här. Men gör inte detta utan att först arbeta igenom problemet mycket noggrant på en testserver. Om du gör ett misstag kommer du att kasta ditt bord.

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

När du har åtgärdat dina problem, gå tillbaka och gör din SELECT * , för att se till att du har alla.

Inaktivera sedan ALLOW_INVALID_DATES och aktivera den aldrig igen.

Det borde rensa upp röran. Lägg märke till att verklig data alltid några rader som inte är perfekta i den.




  1. MySQL INSERT - Kräver fältnamn avgränsning av backtick/accent?

  2. Serienummer per grupp av rader för sammansatt nyckel

  3. Doktrin förstör frågor om Entiteter med en Extends

  4. Hur DATE_SUB() fungerar i MariaDB