我现在正在将一个包含日期的表从使用
我的问题是:如何在日期无效时将列设置为NULL而不出错?我的SQL语句如下:
VARCHAR
列转移到新的使用DATE
列的表中。我已经成功将旧表中的字符串值清理到"YYYY-MM-DD"格式,但是当我尝试插入时,由于一个日期字符串"2006-04-31"有误(实际4月只有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;
CASE
或者过滤掉它呢? - KermitSTR_TO_DATE()
函数的字符串表示一个非法日期时,默认情况下会生成一个NULL
值。 - Mike Brant