Oracle:如何更新表中的“过时”日期?

时间:2015-09-21 19:57:05

标签: sql database oracle oracle11g sql-update

我们的用例

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;

请您查看我的最终查询。

可以吗?或者,也许可以优化它?

2 个答案:

答案 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的值。)