截断不正确的日期值

Posted

技术标签:

【中文标题】截断不正确的日期值【英文标题】:Truncated incorrect date value 【发布时间】:2014-01-19 05:29:25 【问题描述】:

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

当我这样做时:

select str_to_date('04070$','%m%d%Y') from dual;

结果是:

2000-04-07

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

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

#1292 - Truncated incorrect date value: '04070$'

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

【问题讨论】:

【参考方案1】:

这是因为 mysql 在 Strict Mode 上运行。

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)

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

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

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

【讨论】:

那么如何摆脱这个警告呢?当然关闭严格模式不是一种选择。我们是否应该将 substr 日期限制为 6 位? 有几个选项...您可以在发送之前解析日期,您可以使用insert ignore 语句,甚至创建一个函数,如果您的大部分逻辑都在数据库中。这完全取决于您的应用程序以及最适合的应用程序:)【参考方案2】:

将年份格式更改为大写。

str_to_date('01-01-2000','%d-%m-%Y')

【讨论】:

与 MySQL 的函数 str_to_date 相关的可能的 format-specifier 在 symbols table at DATE_FORMAT 中描述【参考方案3】:

虽然你的问题是有效的。但请记住,这是警告而不是错误。

在这种情况下也插入了行。我用一个例子交叉检查了它,它工作正常。

由于 MySQL 总是在匹配适当的数据类型后截断列值,并从完整的字符串中截断不匹配的数据或超出范围的值。

示例:如果要在 char(3) 中插入 'ABCDEFGHIHJHJ',它会截断字符串并在行中插入 ABC。

【讨论】:

在我的情况下这是一个错误Error in query (1292): Truncated incorrect datetime value。它可以防止插入,而选择工作正常【参考方案4】:

Select 语句和 Insert 语句都会出错,因为 $ 不会被视为数字。应该是

INSERT INTO `table1` ( `Date_Posted`) VALUES (str_to_date('040709','%m%d%Y')).

用于使用条目 2009-04-07 插入表 1

【讨论】:

是的,它确实给出了 MySQL 1292 错误:截断不正确的日期值:'04070$' 它可能会在您的系统中提供。它没有给我。一定是一些配置相关的问题。

以上是关于截断不正确的日期值的主要内容,如果未能解决你的问题,请参考以下文章

数据截断:截断不正确的 DOUBLE 值:'3ML80909540'

使用 DELETE 语句截断不正确的 DOUBLE 值

MySQL 截断不正确的 DOUBLE 值?

错误号:1292 在我的 SQL 错误中截断了不正确的 DOUBLE 值

如何理解导致 MySQL 函数中截断不正确的双值错误的原因?

日期时间格式无效:1292 日期时间值不正确 [重复]