截断不正确的日期值

coo*_*ist 5 mysql sql date

在我的情况下,我需要处理无效的日期值,例如:'04070$'。即使我收到诸如“04070$”之类的错误输入,我也需要插入一些内容。

当我做:

select str_to_date('04070$','%m%d%Y') from dual;
Run Code Online (Sandbox Code Playgroud)

结果是:

2000-04-07
Run Code Online (Sandbox Code Playgroud)

但是对于插入语句,我收到一个错误:

INSERT INTO `table1` ( `Date_Posted`) VALUES (str_to_date('04070$','%m%d%Y'))

#1292 - Truncated incorrect date value: '04070$'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么 select 语句运行良好而 insert 语句出错。当出现这种不正确的值时,有没有办法让插入语句插入 NULL 或日期(即使它不正确)?

小智 11

发生这种情况是因为 MySQL 运行在严格模式下。

SELECT声明中,STR_TO_DATE()将返回一年,但由于没有 100% 匹配,它还会发出警告:

mysql> SELECT str_to_date('040710$','%m%d%y');
+---------------------------------+
| str_to_date('040710$','%m%d%y') |
+---------------------------------+
| 2010-04-07                      |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,警告只是在选择结果上提到了一点,但它仍然存在:

mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect date value: '040710$' |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

在严格模式下,尝试INSERT/时任何警告都会变成错误UPDATE。这就是为什么您可以在选择上看到日期但无法将其保存在数据库中的原因。


小智 6

将年份格式更改为大写形式。

str_to_date('01-01-2000','%d-%m-%Y')
Run Code Online (Sandbox Code Playgroud)