wodeqq584958184
2018-06-06 07:16
采纳率: 77.8%
浏览 1.6k
已采纳

关于SQL server 2008时间差datediff函数计算问题

如题,我设置了个触发器,每当table4插入的数据符合触发器条件时,则执行名字为
table5-insert的存储过程,在此存储过程里,包含了时间差datediff的运算过程和赋值,还有数据的更新和叠加,时间段if条件判断语句等,

问题的重点来了:时间差的运算出了问题,我的时间差算法是最新一条的0状态记录machine-itime减去非0状态记录的ng-itime,得出来的时间差值赋值到对应的字段,如果有旧数据记录,则进行数据叠加记录下来。

可是不知道为什么,时间差运算出来的结果有时候是正常,确确实实只相差几秒,但有时候是几百秒的甚至几万秒
没搞懂为什么会有这种状况,我把图发上来让大神和大佬们更好理解我的问题~!

这个是table4插入数据的图,可以很明显的知道,第一次的时间差,两个数据记录相减,得出来的时间差是3秒,第二次的时间差,两个数据记录相减,得出来的时间差是4秒
图片说明

可是,计算出来的结果很有问题,时好时坏的那种,现在我贴图把计算出来的结果给你们看下
这个是第一次进行的时间差数据,没错,是3秒,并且添加进去了
图片说明

这个是第二次进行的时间差数据,由table4看出,明明只影响了4秒,可结果是这样的!!!
图片说明

不知道为何无缘无故变成了91秒,如果再有时间差数据插进来,进行叠加的话,计算出来的数值结果有时候是叠加对的,也有时候像刚刚那种情况,叠加个几十,几百秒进去

请问为什么会发生这样的情况,我真的没搞懂,我用的也是SS单位来计算的,如果换成MI单位计算的话,就不会有这种异常数值结果情况发生了,但是不是每个错误代码类型(即location+pointer连起来就是一个错误代码类型)都是能够持续1分钟以上的,多数都是只影响几秒或几十秒,求各路SQL server大神或大佬来帮忙看看我的问题,顺便留下我的QQ:584958184,希望能解决这个问题~ 感谢大家~!!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 已采纳

    你确认就这几条记录?看存储过程没什么问题,是不是这个触发器逻辑有问题,存储过程重复执行了

    点赞 打赏 评论
  • wodeqq584958184 2018-06-06 07:17

    忘了发下我的存储过程代码,现在发上来给大家看看存储过程哪里有问题

    ALTER proc [dbo].[sp_table5_insert]
    @_T4ID BIGINT -- machine-status=0的自增id
    as

    BEGIN

        -- 上一条错误代码记录id
    DECLARE @_T4ErrorCodeID BIGINT
    
    -- 分钟时差
    DECLARE @_timeDifferenceMin INT
    
    --时间段变量
    DECLARE @shi int
    set @shi=Datename(HOUR,GetDate())
    
    --星期段变量
    DECLARE @xingqi nvarchar(255)
    set datefirst 1
    set @xingqi=Datename(WEEKDAY,GETDATE())
    
    
    -- 开始时间
    DECLARE @_machineItime VARCHAR(50)
    
    -- 获取上一条错误代码记录id并且计算以分钟为单位的时差
    SELECT TOP 1 @_T4ErrorCodeID = id, @_timeDifferenceMin = DATEDIFF(SS,ng_itime,(SELECT machine_itime FROM table4 
    WHERE id = @_T4ID))
            FROM table4 
            WHERE id < @_T4ID AND location IS NOT NULL AND pointer IS NOT NULL AND ng_itime IS NOT NULL 
            ORDER BY id DESC;
    

    --判断时间,星期三早8点到星期三晚8点
    set datefirst 1
    set @xingqi=Datename(WEEKDAY,GETDATE())
    if(@xingqi='星期三') and (@shi>8 and @shi<20)
    begin
    --对T5表操作存在类型累加时间不存在新增
    IF EXISTS (SELECT * FROM table5 AS t5 LEFT JOIN table4 AS t4 ON t4.location=t5.location AND t4.pointer=t5.pointer
    WHERE t4.id=@_T4ErrorCodeID)
    --修改
    UPDATE table5
    SET [Wedtime_8:00AM-8:00PM] = ISNULL([Wedtime_8:00AM-8:00PM] ,0) + @_timeDifferenceMin
    FROM table5 AS t5, table4 AS t4
    WHERE t4.location=t5.location AND t4.pointer=t5.pointer AND t4.id=@_T4ErrorCodeID;
    ELSE
    --插入
    INSERT INTO table5(location,pointer,[Wedtime_8:00AM-8:00PM])

    SELECT location,pointer,@_timeDifferenceMin
    FROM table4

    WHERE id = @_T4ErrorCodeID;

    END

    点赞 打赏 评论
  • wodeqq584958184 2018-06-06 09:39

    这是我执行存储过程的触发器

    ALTER trigger [dbo].[trigger4_2]
    on [dbo].[table4] after insert,update,delete
    as
    declare @insertCount int
    declare @deleteCount int
    declare @t4Id bigint
    begin
    -- 删除数量
    select @deleteCount=COUNT(1) from deleted;
    -- 新增数量
    select @insertCount=COUNT(1) from inserted;

    if (@insertCount=1 and @deleteCount=0)          -- 插入动作
    begin
        select @t4Id=id from inserted;
        if exists (select * from table4 where id = @t4Id and machine_status = 0)
            exec sp_table5_insert @t4Id; 
    end
    
    点赞 打赏 评论
  • wodeqq584958184 2018-06-06 10:13

    我不知道为什么会这样,这代码程序走得太奇怪了,有时候算出来的数值是正常,有时候算出的数值是几百秒,几千秒,几万秒。。。 无语了

    点赞 打赏 评论

相关推荐 更多相似问题