Oracle:如何更新 table 中的 "outdated" 日期?

Oracle: how to update "outdated" date in table?

我们的用例:

对于table USERS:

更新所有行(为列 ACTIVE 设置值 'N')以防用户处于非活动状态(第 'LAST_VISIT' 列)超过 60 分钟。

Google 帮助我找到了如何在数据库中获取当前时间(我使用 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;

能否请您查看我的最终查询。

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

您可以简化查询

UPDATE users u
   SET active = 'N'
 WHERE u.last_visit < sysdate - interval '1' hour;

如果 last_visit 上有可用于查询的索引(因为谓词具有足够的选择性),则此查询可能会使用该索引。

Justin 的回答很好,但它可能会更新太多行。您应该在 where 子句中添加一个额外的条件:

UPDATE users u
   SET active = 'N'
    WHERE active <> 'N' AND u.last_visit < sysdate - interval '1' hour;

这会为已经处于非活动状态的用户保存尝试的更新。 (注意:此版本假定 active 不取 NULL 的值。)