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
的值。)
我们的用例:
对于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
的值。)