错误时MySQL STR_TO_DATE为NULL

时间:2013-10-30 15:22:04

标签: mysql sql date

我目前正在将包含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;

2 个答案:

答案 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;

其他信息

MySQL Documentation

答案 1 :(得分:0)

除了@EduardoDennis,请使用NULLIF过滤掉零日期:

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

请参阅完整的答案here