我目前正在将一个包含 VARCHAR
列的日期的表迁移到一个包含 DATE
列的新表。我设法将旧表中的字符串值清理为 "YYYY-MM-DD" 格式,但是当我尝试执行插入时,我收到了错误,日期为 "2006-04 -31" 因为那个四月只有 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
来隔离那些无效的日期,总共只有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;
最佳答案
一个可能的解决方法是关闭严格模式,无论是为整个服务器,为一个特定的 session ,还是为几个语句。例如:
set @old_sql_mode = @@sql_mode;
set sql_mode = '';
-- Run some statements which may result in error
set sql_mode = @old_sql_mode;
附加信息
关于MySQL STR_TO_DATE NULL 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686836/