【发布时间】:2021-01-18 13:37:23
【问题描述】:
我有一个将日期值存储为字符串的表格,例如'2012-01-15'。其中一些是无效的,例如'2012-04-31'。我想将有效日期插入到另一个表中的DATE 类型列中,如果该月太大,则将日期默认为 1。
DAYNAME 似乎是 MySQL 中唯一会检查日期是否有效的函数。但是,它会针对无效日期发出警告(除了返回NULL),这会升级为INSERT 或UPDATE 语句中的错误。
所以我想做类似的事情
INSERT INTO date_tbl (date_value)
SELECT IF(DAYNAME(date_string) IS NOT NULL, date_string, CONCAT(LEFT(date_string, 8), '1')
FROM date_string_table;
Data truncation: Incorrect datetime value: '2010-04-31' 失败,即使我实际上并未插入无效数据。
使用INSERT IGNORE 的问题是存在实际插入无效数据的风险,我真的很想避免这种情况。
10 月 5 日编辑:
无需创建中间表即可重现此问题
CREATE TABLE date_tbl (
date_val DATETIME
);
INSERT INTO date_tbl (date_val)
SELECT IF(DAYNAME('2012-04-31') IS NOT NULL, '2012-04-31', NULL);
我希望上述 INSERT 为该无效日期插入 NULL,而不是失败。
【问题讨论】: