Mysql
 sql >> Database >  >> RDS >> Mysql

mysql corregge le date non valide

Sembra che il tuo messaggio di errore provenga dal tuo client MySQL, non dal server. Quindi, l'impostazione della modalità server strict non ti aiuterà a visualizzare queste date con questo client.

Sembra che tu abbia alcune date in stile 2012-09-31 o 2013-02-29 nei tuoi dati. Sono formattati correttamente ma per il resto sono sbagliati. Nelle versioni precedenti alla 5.0.2 di MySQL questi non venivano catturati correttamente mentre entravano nei tuoi dati. Ora, il tuo server, imposta su ALLOW_INVALID_DATES non li sta imbavagliando, ma invece li sta convertendo in "0000-00-00". E il cliente li sta prendendo in giro.

Il tuo primo passo per ripulire questo è identificare le righe incriminate. Potresti provare questo.

Innanzitutto, attiva ALLOW_INVALID_DATES

Quindi, esegui questa query per guardarti intorno nella tabella. Non utilizzare SELECT *

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

Cerca di capire dal set di risultati quali date sono spazzatura. Potrebbero essere inseriti per primi in questa istruzione select, ma dovrai cercare un po' per trovarli.

Quindi, scopri come vuoi risolverli. Cancellare le righe? Cambiare la data in 1941-12-07 (la data che vive nell'infamia)? Non possiamo dirti cosa devi fare qui.

Quindi, aggiustali. Se ce ne sono solo uno o due, correggili uno per uno.

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

o

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

Se ce ne sono migliaia, potresti risolverli in blocco con qualcosa del genere. Ma non farlo senza prima aver affrontato il problema con molta attenzione su un server di prova. Se commetti un errore, rovinerai il tuo tavolo.

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

Dopo aver finito di correggere i tuoi problemi, torna indietro e fai il tuo SELECT * , per assicurarti di averli tutti.

Quindi disabilita ALLOW_INVALID_DATES e non riattivarlo mai più.

Questo dovrebbe ripulire il casino. Nota che i dati del mondo reale contengono sempre alcune righe che non sono perfette.