在我的情况下,我需要处理无效的日期值,例如:'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或日期(即使它是不正确的)当出现这样的错误值时?
答案 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'))