MySQL STR_TO_DATE NULL 错误

Posted

技术标签:

【中文标题】MySQL STR_TO_DATE NULL 错误【英文标题】:MySQL STR_TO_DATE NULL on error 【发布时间】:2013-10-30 15:22:04 【问题描述】:

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

【问题讨论】:

你为什么不为它写一个CASE 或者只是过滤掉它? 那张表有 5000+ 行,我不知道有多少日期是无效的。我知道“2006-04-31”是第一个,但不知道还有多少其他日期那里.. 您的列是否定义为非空?当传递给它的字符串表示非法日期时,STR_TO_DATE() 默认会生成 NULL 值。 列可以为NULL,确实是SELECT STR_TO_DATE("2006-04-31", '%Y-%m-%d');返回 NULL,但在 UPDATE、INSERT 语句中使用它时会失败。 看我的回答here。 【参考方案1】:

一种可能的解决方法是关闭严格模式,无论是针对整个服务器、特定会话还是仅针对几个语句。例如:

 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

【讨论】:

嗯,这取决于,当我不得不这样做时,我只是试图将所有数据放入数据库中。之后我将对数据进行必要的清理。【参考方案2】:

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

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

查看我的完整答案here。

【讨论】:

以上是关于MySQL STR_TO_DATE NULL 错误的主要内容,如果未能解决你的问题,请参考以下文章

STR_TO_DATE() 从正确的格式返回错误的数据

mysql日期转换返回null转换某些月份

str_to_date 更改年份数据 MySQL

MySQL STR_TO_DATE函数

mysql 之 str_to_date ()函数 和date_format()函数

mysql 之 str_to_date ()函数 和date_format()函数