【问题标题】:update field every hour in SQL ServerSQL Server 中每小时更新字段
【发布时间】:2019-11-12 16:37:43
【问题描述】:

我在作业中有以下查询,它计划在 L-V 的每个小时运行。

在 FCH_FIN 字段中的表中所做的所有记录都有一个准确的时间,例如:7:00:00 到 19:00:00。

然后我创建一个临时表并从我的原始表中传递数据,我想通过我的临时表来获取使用 GETDATE() 的系统时间与 FCH_FIN 中记录的时间之间的时间差字段,如果小于则将 active 更新为 0。

查询:

DECLARE @count INT;
DECLARE @fch2  DATETIME;
DECLARE @seconds INT;

CREATE table #Suple
(
    ID INT PRIMARY KEY NOT NULL,
    ACTIVO NCHAR(10) NOT NULL,
    FCH_INICIO DATETIME NOT NULL,
    FCH_FIN DATETIME NOT NULL
);

INSERT INTO #Suple 
    SELECT * 
    FROM Original 
    WHERE ACTIVO = 1 
      AND CONVERT(DATE, FCH_FIN) = CONVERT(DATE, GETDATE());

SELECT @count = COUNT(*) FROM #Suple;

WHILE @count > 0
BEGIN
    SELECT 
        @seconds = DATEDIFF(S, GETDATE(),FCH_FIN) 
    FROM
        #Suple 
    WHERE 
        ACTIVO = 1 
        AND CONVERT(DATE, FCH_FIN) = CONVERT(DATE, GETDATE())

    IF (@seconds < 3)
        UPDATE Original  
        SET ACTIVO = 0

    DELETE TOP(1) FROM #Suple
    SET @count = (SELECT COUNT(*) FROM #Suple);
END

DROP TABLE #Suple  

此查询不会更新任何内容

表:

有人可以帮我吗?

【问题讨论】:

    标签: sql sql-server jobs


    【解决方案1】:

    为什么你首先要循环执行此操作?但是看看你的更新声明。您将在循环的每次迭代中更新 Original 中的每一行。但这根本不应该使用循环。您在此处的整个代码块可以简化为单个语句。您不需要临时表或循环。

    在日期函数中也使用简写是challenge

    Update Original 
    where ACTIVO = 0
        AND CONVERT(DATE, FCH_FIN) = CONVERT(DATE, GETDATE())
        and DATEDIFF(Second, GETDATE(),FCH_FIN) < 3
    

    【讨论】:

    • 只修改这个并正常工作 "SET ACTIVO = 0 where ACTIVO = 1"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2011-08-08
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多