Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql corrige datas inválidas


Parece que sua mensagem de erro está vindo do seu cliente MySQL, não do servidor. Portanto, definir o modo estrito do servidor não ajudará você a exibir essas datas com este cliente.

Parece que você tem algumas datas de estilo 2012-09-31 ou 2013-02-29 em seus dados. Eles estão formatados corretamente, mas de outra forma estão errados. Nas versões pré 5.0.2 do MySQL, eles não eram capturados corretamente entrando em seus dados. Agora, seu servidor, definido como ALLOW_INVALID_DATES não está engasgando com eles, mas está convertendo-os para '0000-00-00'. E o cliente está gacking neles.

Seu primeiro passo para limpar isso é identificar as linhas ofensivas. Você poderia tentar isso.

Primeiro, ative ALLOW_INVALID_DATES

Em seguida, execute esta consulta para examinar sua tabela. Não use SELECT *
  SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d') 
    FROM mytable
   ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d') 

Tente descobrir a partir do conjunto de resultados quais datas são lixo. Eles podem ser colocados em primeiro lugar nesta instrução select, mas você terá que mexer um pouco para encontrá-los.

Em seguida, descubra como você deseja corrigi-los. Excluir as linhas? Mudar a data para 1941-12-07 (a data que vive na infâmia)? Não podemos dizer o que você precisa fazer aqui.

Então, conserte-os. Se houver apenas um ou dois, corrija-os um por um.
  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.'

Se houver milhares deles, você pode corrigi-los em massa com algo assim. Mas não faça isso sem primeiro resolver o problema com muito cuidado em um servidor de teste. Se você cometer um erro, sua mesa será jogada no lixo.
  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')

Após terminar de corrigir seus problemas, volte e faça seu SELECT * , para garantir que você tenha todos eles.

Em seguida, desative ALLOW_INVALID_DATES e nunca reative-o novamente.

Isso deve limpar a bagunça. Observe que os dados do mundo real sempre têm algumas linhas que não são perfeitas neles.