我目前正在将列中包含日期的表迁移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
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;