2011-09-16 26 views
0

我有一个名为node_status表,有三列:如何的当前时间和列的时间差的基础上更新表

  1. id (int)
  2. status (bit)
  3. modifiedtime (smalldatetime)

我想运行一个查询,如果表中的任何一行包含modifiedtime值超过5 mi在当前时间之前nutes,然后将status列设置为0(false)。

任何机构可以告诉我如何做到这一点? (使用SQL Server)

感谢

回答

2

当你想要做的一个基于当前时间的查询可以使用getdate(),并使用dateadd函数从日期中添加或删除时间量。因此:

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

可以使用DATEADD功能前五分钟来计算的日期/时间,然后modifiedtime列与此值:

UPDATE node_status SET status = 0 WHERE modifiedtime <= dateadd(minute, -5, CURRENT_TIMESTAMP) 
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. 
相关问题