我想将一条表记录插入到另一个表中。我正在选择用户 ID、日期和差异。当我插入一个用户的数据时,它工作正常,但是当我插入多条记录时,它给我一个错误 SQL Error [1292] [22001]: Data truncation: Truncated invalid 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
如果我删除评论,它对某个特定用户来说效果很好。
最佳答案
让我们从错误消息开始:
Data truncation: Truncated incorrect time value: '841:52:24.000000'
此消息表明 MySQL 在某个阶段遇到了无法转换为日期/时间/日期时间
的值。因此,隔离问题的工作应首先关注值在何处转换为这些数据类型。
如果不知道所使用的所有字段的数据类型,就很难说问题可能出在哪里。然而,一旦我们知道查询本身运行时没有任何提示,我们也就知道问题必须出在插入本身期间发生的转换。所选数据中的某些内容不是有效日期,但正在插入日期字段中。尽管日期和时间参与了 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%'
一旦纠正了有问题的数据,您应该能够从 INSERT/SELECT
语句中删除“修复”,不过最好调查一下不良数据是如何进入系统的。
关于mysql - 将一条表记录插入到另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43936221/