3

現在、列に日付を含むテーブルを、VARCHAR列を含む新しいテーブルに移行してDATEいます。古いテーブルの文字列値を「YYYY-MM-DD」の形式にサニタイズできましたが、挿入を実行しようとすると、日付「2006-04-31」でエラーが発生しました。これは、4 月が 30 日しかないためです。 (登録時のミスでした)、

私の質問は次のとおりです。日付が無効な場合、エラーを発生させずに列を NULL に設定するにはどうすればよいですか? 私のSQLは次のとおりです。

INSERT INTO newFancyTable (created_at)
SELECT str_to_date(created, '%Y-%m-%d') FROM oldCrappyTable;

エラーは次のとおりです。

Error Code: 1292. Incorrect date value: '2006-04-31' for column 'created_at' at row 1

ありがとう

アップデート

また、次のアプローチを使用してみました。

INSERT INTO newFancyTable (created_at)
SELECT CAST(created AS DATE) FROM oldCrappyTable;

同じエラーが発生し、を更新しようとするとoldCrappyTable、同じ結果が返されます。

UPDATE oldCrappyTable SET created = CAST(created AS DATE);

どちらも次を返します。

Error Code: 1292. Incorrect datetime value: '2006-04-31'

更新 2

最後に、複数CASEの s を使用してその無効な日付を分離しました。合計すると、そのうちの 5 つだけでした。それでも、次のようにして問題を再現できます。

CREATE TABLE dates_temp (
  test_date DATE DEFAULT NULL
) ENGINE=MEMORY;

INSERT INTO dates_temp
SELECT STR_TO_DATE("2006-04-31", '%Y-%m-%d');

DROP TABLE dates_temp;
4

2 に答える 2

3

可能な回避策は、サーバー全体、特定のセッション、またはいくつかのステートメントに対して、厳密モードをオフにすることです。例えば:

 set @old_sql_mode = @@sql_mode; 
 set sql_mode = ''; 
 -- Run some statements which may result in error
 set sql_mode = @old_sql_mode;

追加情報

MySQL ドキュメント

于 2013-10-30T15:55:42.327 に答える