如何根据当前时间和列时间的差异更新表

时间:2011-09-16 08:34:03

标签: sql sql-server

我有一个名为node_status的表,它有三列:

  1. id (int)
  2. status (bit)
  3. modifiedtime (smalldatetime)
  4. 我想在其上运行查询,以便如果表中的任何行包含modifiedtime值,该值在当前时间之前超过5分钟,则status列设置为0(false )。

    任何人都能告诉我怎么做吗? (使用SQL Server)

    由于

3 个答案:

答案 0 :(得分:3)

查询

UPDATE node_status
SET [Status] = 0
WHERE DATEDIFF(n, ModifiedTime, CURRENT_TIMETAMP) >= 5

将完成这项工作,但是,如果您的node_status表很大,那么由于表/索引扫描,性能将会很糟糕。如果您有ModifiedTime的索引:

DECLARE @ThresholdTime DATETIME
SET @ThresholdTime = DATEADD(n, -5, CURRENT_TIMESTAMP)

UPDATE node_status
SET [Status] = 0
WHERE ModifiedTime <= @ThresholdTime

甚至更好,如果大多数记录都有node_status = 0(即选择性)

UPDATE node_status
SET [Status] = 0
WHERE ModifiedTime <= @ThresholdTime
    AND [Status] = 1 -- You've stated that status is a bit - I've assumed not nullable.

答案 1 :(得分:2)

如果要根据当前时间进行查询,可以使用getdate(),并使用dateadd函数添加或删除日期中的时间量。就这样:

update 
     node_status 
set 
     status = 0 
where 
     modifiedtime < dateadd(minute, -5, getdate())

答案 2 :(得分:1)

您可以使用DATEADD函数计算五分钟之前的日期/时间,然后将modifiedtime列与此值进行比较:

UPDATE node_status SET status = 0 WHERE modifiedtime <= dateadd(minute, -5, CURRENT_TIMESTAMP)