【问题标题】:How to remove invalid date values in MariaDB 10.1?如何删除 MariaDB 10.1 中的无效日期值?
【发布时间】:2016-11-23 16:40:38
【问题描述】:

我有一个带有一个日期列的表

foo(之前):

+------------+
| datecolumn |
+------------+
| 1939-04-06 |
| 1949-02-30 |
+------------+

如果日期无效,我想将日期设置为 NULL。

foo(之后):

+------------+
| datecolumn |
+------------+
| 1939-04-06 |
| NULL       |
+------------+

在 MySQL (5.7) 中,我可以使用这个技巧来完成:

ALTER TABLE `foo` MODIFY COLUMN `datecolumn` varchar(255) NULL DEFAULT NULL FIRST;
SET SQL_MODE='ALLOW_INVALID_DATES';
ALTER TABLE `foo` MODIFY COLUMN `datecolumn` date NULL DEFAULT NULL FIRST;
SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
UPDATE `foo` SET `datecolumn` = NULL WHERE `datecolumn` = '0000-00-00';

但是,无论我尝试了什么,这似乎都不适用于 MariaDB 10.1:

1) 各种 SQL_MODE 的

2) 各种 STR_TO_DATE 或 DATE_FORMAT 方法(我希望得到 NULL 我将无效的日期字符串转换为日期)

谁能帮我实现我的目标?

【问题讨论】:

  • 那么你是说SELECT STR_TO_DATE('1949-02-30','%Y,%m,%d') 在MariaDB 中 返回NULL 吗?那么它实际上返回了什么?
  • SELECT STR_TO_DATE('1949-02-30','%Y,%m,%d') 确实返回 NULL,但 SELECT STR_TO_DATE('1949-02-10','%Y,%m,%d') 也是如此。 SELECT STR_TO_DATE('1949-02-30','%Y-%m-%d') 但返回 1949-02-30(1949-02-10 的模拟)。
  • STR_TO_DATE 不返回 NULL 似乎是一个错误。它存在于 MySQL 5.5/5.6 和所有版本的 MariaDB 中。在 MySQL 5.7 中,它似乎已修复,但并不完美,因为它会产生重复的警告,但至少它确实返回 NULL; MariaDB 也应该很快修复。

标签: mysql mariadb


【解决方案1】:

这应该可行:

UPDATE foo SET datecolumn = CAST(datecolumn AS DATE);

确保在 SQL_MODE 中未设置严格模式,否则任何尝试都会导致错误。

【讨论】:

  • 为了完整起见:将 datecolum 修改为 datetime 类型 DID 将其设置为 '0000-00-00 00:00:00'。也许您上面提到的 STR_TO_DATE 问题确实是一个错误,但您的解决方案目前运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
相关资源
最近更新 更多