我想将表记录插入另一个表中。我正在选择用户ID,日期和差异。当我插入一个用户的数据时它工作正常,但当我插入多个记录时,它给我一个错误SQL Error [1292] [22001]: Data truncation: Truncated incorrect time value: '841:52:24.000000'
。
insert into
features.Daily_variance_of_time_between_calls(
uId,
date,
varianceBetweenCalls)
SELECT
table_test.uid as uId,
SUBSTRING(table_test.date, 1, 10) as date ,
VARIANCE(table_test.DurationSinceLastCall) as varianceBetweenCalls #calculating the vairiance of inter-event call time
FROM
(SELECT
id,m.uid, m.date,
TIME_TO_SEC(
timediff(m.date,
COALESCE(
(SELECT p.date FROM creditfix.call_logs AS p
WHERE
p.uid = m.uid
AND
p.`type` in (1,2)
AND
(p.id < m.id AND p.date < m.date )
ORDER BY m.date DESC, p.duration
DESC LIMIT 1 ), m.date))
) AS DurationSinceLastCall,
COUNT(1)
FROM
(select distinct id, duration, date,uid from creditfix.call_logs as cl ) AS m
WHERE
m.uId is not NULL
AND
m.duration > 0
# AND
# m.uId=171
GROUP BY 1,2
) table_test
GROUP BY 1,2
如果我删除评论,它适用于某个特定用户。
答案 0 :(得分:0)
让我们从错误消息开始:
数据截断:截断的错误时间值:&#39; 841:52:24.000000&#39;
此消息表明,在某些阶段,MySQL正在运行一个无法转换为date/time/datetime
的值。因此,隔离问题的努力应首先关注将值转换为这些数据类型的位置。
在不知道所有使用的字段的数据类型的情况下,很难说出问题可能出在哪里。但是,一旦我们知道它自己的查询没有抱怨,我们就会知道问题必须在插入过程中发生转换。所选数据中的某些内容不是有效日期,而是插入到日期字段中。虽然计算varianceBetweenCalls
时涉及的日期和时间,variance
本身会返回数值数据类型。因此,我推断问题必须与SUBSTRING(table_test.date, 1, 10)
返回的数据一起插入date
字段。
根据评论,结果证明是正确的。您可以通过添加以下子句来排除错误数据并允许插入工作:
WHERE
table_test.date NOT LIKE '841%'
AND table_test.DurationSinceLastCall NOT LIKE '841%' -- I actually think this line is not required.
或者,您可以通过删除INSERT
并使用
WHERE
table_test.date LIKE '841%'
OR table_test.DurationSinceLastCall LIKE '841%' -- I actually think this line is not required.
或更好
SELECT *
FROM creditfix.call_logs m
WHERE m.date LIKE '841%'
但是,我不确定该字段的数据类型,因此您可能需要这样:
SELECT *
FROM creditfix.call_logs m
WHERE SUBSTRING(m.date,10) LIKE '841%'
纠正违规数据后,您应该可以删除&#34;修复&#34;从您的INSERT/SELECT
声明中,尽管调查坏数据如何进入系统是明智的。