错误1292(22007)in mysql for INSERT INTO SELECT CURRENT_DATE()

时间:2015-11-18 13:22:57

标签: mysql sql

我试图使用sql查询保持表MASTER_TABLE中每天的行数早于表OLD_COUNT中的特定日期: -

INSERT INTO test_db.OLD_COUNT(Count, Date) SELECT COUNT(*),  CURRENT_DATE() FROM test_db.MASTER_TABLE WHERE TIMESTAMP(UPDATE_DATE) < '2015-11-12 15:36:20';

执行此操作,会给我一个错误ERROR 1292 (22007): Truncated incorrect datetime value: '2015-11-12 19:20:15:850'

我的问题是插入查询失败 WHERE TIMESTAMP(UPDATE_DATE)

执行SELECT COUNT(*), CURRENT_DATE() FROM test_db.MASTER_TABLE WHERE TIMESTAMP(UPDATE_DATE) < '2015-11-12 15:36:20';会给我预期的输出

+----------+----------------+
| COUNT(*) | CURRENT_DATE() |
+----------+----------------+
|        0 | 2015-11-18     |
+----------+----------------+
1 row in set, 11 warnings (0.04 sec)

OLD_COUNTCountbigint(20)Datedate
MASTER_TABLEUPDATE_DATEvarchar(30)(相关数据的示例为2015-11-12 19:20:15:850)。 不幸的是,我无法更改表定义或强制任何程序以任何预定义的格式输入数据。因此,我必须处理我能找到的任何相关数据 我使用的是5.6.26 MySQL

有人可以说明INSERT查询在SELECT工作时失败或查询错误的原因吗?

-------- -------- UPDATE
请原谅我

  

(相关数据的例子是2015-11-12 19:20:15:850)。不幸的是,我无法更改表定义或强制任何程序以任何预定义的格式输入数据。因此,我必须处理我能找到的任何相关数据

没有正确地传达我的约束力。

我只需要考虑根据this自动转换为TIMESTAMP的数据。 Wed Nov 10 19:25:27 PST 20151447934215(我无法控制的其他格式)等数据不相关但存在
UPDATE_DATE < '2015-11-12 15:36:20'或其任何衍生物按字典顺序比较它们不按时间顺序排列(UPDATE TIMEvarchar(30))。它现在可以在我的测试床上使用,但是可能存在生产数据(例如10-11-2015 7:25:27 PM)。

2 个答案:

答案 0 :(得分:2)

(10, 200)SELECT语句之间的行为差​​异出现,默认情况下在MySQL上启用INSERT sql模式。
STRICT_TRANS_TABLES语句执行但有警告(例如SELECT) 如果Truncated incorrect datetime value: '2015-11-12 19:20:15:850'语句中包含相同的SELECT语句,则在INSERT中,这些警告会被视为错误,数据插入将被中止。

  

如果严格模式不起作用,MySQL会为无效或缺失值插入调整值并产生警告(请参见第13.7.5.41节“显示警告语法”)。在严格模式下,您可以使用INSERT IGNORE或UPDATE IGNORE生成此行为。

     

对于不更改数据的SELECT等语句,无效值会在严格模式下生成警告,而不是错误。

使用 Strict SQL Mode 解决问题。也可以使用INSERT IGNORE

特别是对于MySQL版本5.6,可以找到文档here,但更好的阅读可能是this

答案 1 :(得分:0)

你能试试吗

WHERE UPDATE_DATE < '2015-11-12 15:36:20'

而不是

WHERE TIMESTAMP(UPDATE_DATE) < '2015-11-12 15:36:20'

编辑:

如果你需要的部分总是在同一个位置,而timestamp()会给你错误,你可以尝试

Substring(UPDATE_DATE, position, length)

对于子字符串的选项,您可以查看here

EDIT2:

要获得可比较格式的数据,您可以尝试

STR_TO_DATE(UPDATE_DATE, '%Y-%m-%d') 

(根据需要选择最佳格式),然后像这样应用子字符串:

Substring(STR_TO_DATE(UPDATE_DATE, '%Y-%m-%d'), position, length)