我有一个名为node_status
表,有三列:如何的当前时间和列的时间差的基础上更新表
id (int)
status (bit)
modifiedtime (smalldatetime)
我想运行一个查询,如果表中的任何一行包含modifiedtime
值超过5 mi在当前时间之前nutes,然后将status
列设置为0(false)。
任何机构可以告诉我如何做到这一点? (使用SQL Server)
感谢
我有一个名为node_status
表,有三列:如何的当前时间和列的时间差的基础上更新表
id (int)
status (bit)
modifiedtime (smalldatetime)
我想运行一个查询,如果表中的任何一行包含modifiedtime
值超过5 mi在当前时间之前nutes,然后将status
列设置为0(false)。
任何机构可以告诉我如何做到这一点? (使用SQL Server)
感谢
当你想要做的一个基于当前时间的查询可以使用getdate(),并使用dateadd函数从日期中添加或删除时间量。因此:
update
node_status
set
status = 0
where
modifiedtime < dateadd(minute, -5, getdate())
可以使用DATEADD功能前五分钟来计算的日期/时间,然后modifiedtime列与此值:
UPDATE node_status SET status = 0 WHERE modifiedtime <= dateadd(minute, -5, CURRENT_TIMESTAMP)
查询
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.