日期时间比较更新两列

时间:2012-02-15 15:40:29

标签: sql-server datetime comparison

当新作业添加到数据库时,SQL Server创建了datetime。将作业添加到数据库3小时后,如果未完成日志级别,则应更改具有唯一作业ID的作业的状态。

这是我到目前为止所拥有的。 (不检查状态)

use DistributedComputing
if exists (select * from sys.objects where type = 'P' and name = 'proc_dc_timeout')
drop procedure proc_dc_timeout
go
create procedure proc_dc_timeout
AS
declare @JobID int
begin
if exists (select StartDate from Job where JobID = @JobID and DATEDIFF(hh,StartDate,GETDATE()) > 3 )
update Job
set LogLevel = 1, Status = 'error'
end

go
execute proc_dc_timeout

但如果我运行查询,则不会影响任何行。请帮忙

5 个答案:

答案 0 :(得分:1)

您的变量@JobID已声明,但未设置 - 因此 - 您的IF语句永远不会成功,因为与NULL值的任何比较都将返回false。您需要将值分配给变量,或使用IS NULL比较

答案 1 :(得分:1)

有几件事......

您的@JobID变量似乎应该是该过程的参数。你永远不会给这个变量赋值。

其次,您的DATEDIFF(hh, StartDate, GETDATE()) > 3很可能会更改为DATEDIFF(hh, StartDate, GETDATE()) >= 3;如目前所写,在达到4小时标记之前,您不会进行任何更新。

此外,您是否考虑过使用ALTER PROCEDURE语法而不是检查程序是否存在以及每次运行时是否删除/重新创建?

ALTER PROCEDURE proc_dc_timeout ( @JobID INT )
AS
    BEGIN
        UPDATE j
        SET j.[LogLevel = 1,
            j.[Status] = 'error'
        FROM [Job] j
        WHERE j.[JobID] = @JobID
            AND DATEDIFF(hh, j.[StartDate], GETDATE()) >= 3
    END
GO

答案 2 :(得分:1)

如上面的答案所示,JobID为空。假设您要检查并更新所有作业,这可能就是您想要的:

create procedure proc_dc_timeout
AS
update Job
set LogLevel = 1, Status = 'error'
where DATEDIFF( minute, StartDate, GETDATE() ) > 180
    and Status not in ( 'error' )

我使用DATEDIFF(分钟......)代替小时,但这只是个人偏好,以确保逐个错误不会产生如此巨大的差异。

答案 3 :(得分:0)

这不起作用,因为您没有为@JobID设置任何值,它将是null并且您存在查询将始终失败

答案 4 :(得分:0)

在执行过程时,您没有给@JobID一个值,并且参数声明位于错误的位置。

CREATE PROCEDURE proc_dc_timeout
   @JobID int // <== declare parameter here
AS
BEGIN
    //...
END
go

EXECUTE proc_dc_timeout @JobID // <== put value here instead @JobID