我们的用例:
表USERS
:
如果用户处于非活动状态(列'N'
)超过ACTIVE
分钟,则更新所有行(列'LAST_VISIT'
的设置值60
)。
Google帮助我找到了如何获取db中的当前时间(我使用Oracle
):
SELECT sysdate FROM dual;
然后我找到了如何找到两个日期之间的分钟差异的方法:
SELECT(date1 - date2)*1440
看起来有点难看......但还可以。
现在,我正在努力将所有这些结合在一起:
UPDATE USERS u
SET ACTIVE='N'
WHERE SELECT((SELECT sysdate FROM dual) - u.LAST_VISIT)*1440 >60;
请您查看我的最终查询。
可以吗?或者,也许可以优化它?
答案 0 :(得分:6)
您可以简化查询
UPDATE users u
SET active = 'N'
WHERE u.last_visit < sysdate - interval '1' hour;
如果last_visit
上有可用于查询的索引(因为谓词具有足够的选择性),则此查询可能会使用该索引。
答案 1 :(得分:3)
贾斯汀的答案非常好,但它可能会更新太多行。您应该为where
子句添加一个额外条件:
UPDATE users u
SET active = 'N'
WHERE active <> 'N' AND u.last_visit < sysdate - interval '1' hour;
这样可以保存已经处于非活动状态的用户的尝试更新。 (注意:此版本假定active
未使用NULL
的值。)