【问题标题】:Insert a date in MySQL only if it is valid仅当日期有效时才在 MySQL 中插入日期
【发布时间】:2021-01-18 13:37:23
【问题描述】:

我有一个将日期值存储为字符串的表格,例如'2012-01-15'。其中一些是无效的,例如'2012-04-31'。我想将有效日期插入到另一个表中的DATE 类型列中,如果该月太大,则将日期默认为 1。

DAYNAME 似乎是 MySQL 中唯一会检查日期是否有效的函数。但是,它会针对无效日期发出警告(除了返回NULL),这会升级为INSERTUPDATE 语句中的错误。

所以我想做类似的事情

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,而不是失败。

【问题讨论】:

    标签: mysql sql string date


    【解决方案1】:

    一种解决方法是使用INSERT IGNORE,然后在事后验证:

    SELECT date_value
    FROM date_tbl
    WHERE DAYNAME(date_value) IS NULL;
    

    应该返回零行。

    【讨论】:

      【解决方案2】:

      您可以将正确日期的天数和该月的最后一天与LAST_DAYSTR_TO_DATE 进行比较。

      所以你的查询是:

      INSERT INTO date_tbl (date_val)
      SELECT IF(DAY(STR_TO_DATE('2012-02-30','%Y-%m-%d')) > DAY(LAST_DAY(STR_TO_DATE('2012-02-30','%Y-%m-%d'))), NULL,'2012-02-30');
      

      DB Fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 2017-04-01
        • 1970-01-01
        • 2016-05-24
        • 2015-02-28
        • 1970-01-01
        相关资源
        最近更新 更多