SQL server 2008如何在datediff函数增加一个计算条件

SQL server 2008如何在datediff函数增加一个计算条件

问题描述:

如题,我现在有个存储过程,这个存储过程是用来计算当table4插入的记录的时间差(用的是datediff函数),存储过程的执行是靠table4中的触发器来触发执行的,触发器的执行条件是(当table4中每当machine-statu字段s有非0记录数据插入,且下一条记录machine-status字段是为0的时候,则执行该存储过程)
触发器代码:

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

目前存储过程的计算代码是这样:

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

由此可见,我的存储过程计算时间差是根据table4插入记录出现的先后顺序来配对计算的,但是现在发现,这样计算出来的结果有问题,详细的异常问题解释可到我另一个问答中查看,https://ask.csdn.net/questions/691300(在一个热心导师的回复下知道了问题所在)

重点不是这个,因为现在找出问题所在了。

现在我在table4中新加了一个字段used,并且设置了它的默认值为0,我想在datediff函数计算时间差的同时,加上一个used = 0 的条件,意思是计算的两条记录还要符合used = 0 才开始计算这两条记录的时间差,
当计算完后,并把计算的两条记录的时间差结果赋值到table5中,并且同时把这条记录的used = 0值更新为used= 1,表示已经计算过了

这么做的目的是,想给计算的两条记录建立一个配对关系,这样好让程序知道计算并赋值
附上我的table4,table5表结构
table4:
图片说明

table5:
图片说明

可是不知道该怎么编写这个条件语句和更新语句,本人小白一枚,刚从学校出来实习,项目一个人做,没人带,本来这个礼拜就要测试项目,可是现在出了这个问题,根本就测试不了,求CSDN内的各位SQL server大佬和专家帮我写下这个语句代码,留下我的QQ:584958184,还有哪里不清楚可以跟我说,我可以再解释,现在真的很急,跪求跪求帮助啊~!!!

大概下面这样,看注释的地方,还有判断是否存在未使用ng-time的记录

 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
and used=0--------------------------------增加未使用判断
ORDER BY id DESC;

if @_T4ErrorCodeID is not null------------未使用的记录存在再操作表
begin
--判断时间,星期三早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;

update table4 set used=1 WHERE id = @_T4ErrorCodeID;------------更新表4的使用字段

END

end 

在线等~真的很急~!!!!!