mysql - 将一条表记录插入到另一个表中

标签 mysql sql

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

相关文章:

javascript - 为什么 sails-mysql 会导致 Passport-local 出错?

mysql - SQL 查询 : rows linked by one joint table INSERT to another joint table

mysql - 从sql中的连接中选择包含最大值的多行

mysql - UNION SELECT 的问题

mysql - MySQL排序后如何选择更多行?

mysql - 如果在 concat 里面

Mysql 连接字符串错误 ASP

mysql - 用户 'user1' 的访问被拒绝 @'localhost' godaddy

用于德语变音符号的 MySQL UTF8 排序规则

php - 在 PHP 中的 <img> 标签的开头和结尾附加 <figure> 标签