sql >> Base de Datos >  >> RDS >> Mysql

mysql corrige fechas inválidas

Parece que su mensaje de error proviene de su cliente MySQL, no del servidor. Por lo tanto, configurar el modo estricto del servidor no lo ayudará a mostrar estas fechas con este cliente.

Parece que tiene algunas fechas de estilo 2012-09-31 o 2013-02-29 en sus datos. Están correctamente formateados, pero por lo demás están mal. En las versiones anteriores a 5.0.2 de MySQL, estos no se detectaron correctamente al ingresar a sus datos. Ahora, su servidor, configurado en ALLOW_INVALID_DATES no los está ahogando, sino que los está convirtiendo en '0000-00-00'. Y el cliente los está mirando.

Su primer paso para limpiar esto es identificar las filas ofensivas. Podrías probar esto.

Primero, activa ALLOW_INVALID_DATES

Luego, ejecute esta consulta para buscar en su tabla. No use SELECT *

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

Intente averiguar a partir del conjunto de resultados qué fechas son basura. Es posible que se coloquen primero en esta declaración de selección, pero tendrá que jugar un poco para encontrarlos.

A continuación, descubra cómo desea solucionarlos. ¿Eliminar las filas? ¿Cambiar la fecha a 1941-12-07 (la fecha que vive en la infamia)? No podemos decirle lo que debe hacer aquí.

Luego, arréglalos. Si solo hay uno o dos, arréglalos uno por 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.'

Si hay miles de ellos, podrías arreglarlos de forma masiva con algo como esto. Pero no haga esto sin antes resolver el problema con mucho cuidado en un servidor de prueba. Si cometes un error, destrozarás tu mesa.

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

Una vez que haya terminado de corregir sus problemas, regrese y haga su SELECT * , para asegurarte de que los tienes todos.

Luego deshabilite ALLOW_INVALID_DATES y nunca volver a habilitarlo de nuevo.

Eso debería limpiar el desorden. Tenga en cuenta que los datos del mundo real siempre tienen algunas filas que no son perfectas.