如题,我设置了个触发器,每当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,希望能解决这个问题~ 感谢大家~!!
你确认就这几条记录?看存储过程没什么问题,是不是这个触发器逻辑有问题,存储过程重复执行了
忘了发下我的存储过程代码,现在发上来给大家看看存储过程哪里有问题
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
这是我执行存储过程的触发器
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
我不知道为什么会这样,这代码程序走得太奇怪了,有时候算出来的数值是正常,有时候算出的数值是几百秒,几千秒,几万秒。。。 无语了