将表记录插入另一个表

时间:2017-05-12 11:02:44

标签: mysql sql

我想将表记录插入另一个表中。我正在选择用户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

如果我删除评论,它适用于某个特定用户。

1 个答案:

答案 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声明中,尽管调查坏数据如何进入系统是明智的。