我目前正在将包含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;
答案 0 :(得分:3)
可能的解决方法是关闭整个服务器,特定会话或几个语句的严格模式。例如:
set @old_sql_mode = @@sql_mode;
set sql_mode = '';
-- Run some statements which may result in error
set sql_mode = @old_sql_mode;
其他信息
答案 1 :(得分:0)
除了@EduardoDennis,请使用NULLIF
过滤掉零日期:
INSERT INTO newFancyTable (created_at)
SELECT nullif(str_to_date(created, '%Y-%m-%d'), from_days(0)) FROM oldCrappyTable;
请参阅完整的答案here。