sql >> データベース >  >> RDS >> Mysql

mysqlは無効な日付を修正します

    エラーメッセージはサーバーではなくMySQLクライアントから送信されているようです。したがって、サーバーの厳密モードを設定しても、このクライアントでこれらの日付を表示するのに役立ちません。

    データに2012-09-31または2013-02-29スタイルの日付が含まれているようです。それらは正しくフォーマットされていますが、それ以外は間違っています。 MySQLの5.0.2より前のバージョンでは、これらはデータに正しく入り込むことができませんでした。これで、サーバーがALLOW_INVALID_DATESに設定されました。 それらをギャグしていませんが、代わりに「0000-00-00」に変換しています。そして、クライアントはそれらをあざ笑っています。

    これをクリーンアップするための最初のステップは、問題のある行を特定することです。これを試すことができます。

    まず、ALLOW_INVALID_DATESをオンにします

    次に、このクエリを実行してテーブルを調べます。 SELECT *は使用しないでください

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

    結果セットから、どの日付がガベージであるかを把握してください。それらはこのselectステートメントの最初に配置される可能性がありますが、それらを見つけるために少しいじくり回す必要があります。

    次に、それらをどのように修正するかを考えます。行を削除しますか?日付を1941-12-07(悪名高い日付)に変更しますか?ここで何をする必要があるかはわかりません。

    次に、それらを修正します。 1つか2つしかない場合は、1つずつ修正してください。

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

    または

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

    それらが何千もある場合は、このようなもので一括修正できます。 ただし、最初にテストサーバーで問題を慎重に処理せずに、これを実行しないでください。間違えるとテーブルをゴミ箱に捨ててしまいます。

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

    問題の修正が終了したら、戻ってSELECT *を実行します。 、すべてを確実に入手するため。

    次に、ALLOW_INVALID_DATESを無効にします 再度有効にすることはありません。

    それは混乱をきれいにするはずです。実際のデータには、常に完全ではない行があることに注意してください。




    1. Vb6レコード更新エラー

    2. MySQL-数字または特殊文字で始まる場合

    3. mysqlで一定期間のローリング合計を作成します

    4. OracleでのDATEのフォーマット