截断的日期值不正确

时间:2014-01-19 05:29:25

标签: mysql sql date

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

当我这样做时:

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

结果是:

2000-04-07

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

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

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

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

5 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

发生这种情况是因为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上看到日期但不能将其保存在数据库中的原因。

答案 2 :(得分:0)

将年份格式更改为大写。

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

答案 3 :(得分:-2)

Select语句和Insert语句将给出错误,因为$不会被视为数字。它必须是

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

使用条目2009-04-07

插入表1

答案 4 :(得分:-2)

替换

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

通过

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