3

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

最后,我使用了多个CASEs 来隔离无效日期,总的来说它们只有 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 回答
0

除了@EduardoDennis 回答使用NULLIF过滤掉零日期:

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

在这里查看我的完整答案。

于 2018-01-29T14:58:01.757 回答