我有一个名为node_status
的表,它有三列:
id (int)
status (bit)
modifiedtime (smalldatetime)
我想在其上运行查询,以便如果表中的任何行包含modifiedtime
值,该值在当前时间之前超过5分钟,则status
列设置为0(false )。
任何人都能告诉我怎么做吗? (使用SQL Server)
由于
答案 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)