我试图使用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_COUNT
列Count
为bigint(20)
,Date
为date
。
MASTER_TABLE
列UPDATE_DATE
为varchar(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 2015
或1447934215
(我无法控制的其他格式)等数据不相关但存在。
UPDATE_DATE < '2015-11-12 15:36:20'
或其任何衍生物按字典顺序比较它们不按时间顺序排列(UPDATE TIME
为varchar(30)
)。它现在可以在我的测试床上使用,但是可能存在生产数据(例如10-11-2015 7:25:27 PM
)。
答案 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
答案 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)