wodeqq584958184 2018-06-11 02:34 采纳率: 77.8%
浏览 795
已采纳

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,还有哪里不清楚可以跟我说,我可以再解释,现在真的很急,跪求跪求帮助啊~!!!

  • 写回答

3条回答 默认 最新

  • Go 旅城通票 2018-06-11 04:23
    关注

    大概下面这样,看注释的地方,还有判断是否存在未使用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 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏