【问题标题】:Oracle: how to update "outdated" date in table?Oracle:如何更新表中的“过时”日期?
【发布时间】:2015-12-18 15:25:19
【问题描述】:

我们的用例

对于表USERS

更新所有行(为列ACTIVE 设置值'N')以防用户处于非活动状态(列'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;

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

没事吧?或者,也许,可以优化它?

【问题讨论】:

  • 您可以随时在事务中运行更新,检查结果,如果一切正常,则提交或回滚。请记住,您可能会阻止其他用户
  • SYSDATE 是一个函数,您可以直接引用它,无需子选择:WHERE (sysdate - u.LAST_VISIT)*1440 > 60

标签: sql database oracle oracle11g sql-update


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以简化查询

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2021-03-25
      • 2013-01-28
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多