更新所有过去 3 天的记录

Posted

技术标签:

【中文标题】更新所有过去 3 天的记录【英文标题】:updating records of all the past 3 days back 【发布时间】:2018-08-13 07:11:07 【问题描述】:

我有以下关于EXIT_DATE日期列的更新基础的查询,现在请告知。

我有以下查询。假设今天是 8 月 13 日,所以我想更新从日期 10 Aug 、 11 Aug 和 12 Aug 开始的所有记录,考虑到时间戳也非常准确。

也就是说,我想更新 3 天前的所有记录。

请告知此查询是否正确,或者可以改进以下实现。

UPDATE CTR_QWE SET STATUS = 'COMPLETED' 
WHERE STATUS IN ('N','P') 
  AND EXIT_DATE >= TRUNC(SYSDATE-3)
  AND EXIT_DATE <  TRUNC(SYSDATE); 

【问题讨论】:

How to get last 7 days data from current datetime to last 7 days in sql server的可能重复 这可能是 [如何在 sql server 中获取从当前日期时间到最近 7 天的最近 7 天数据] (***.com/questions/27599557/…) 查询对我来说看起来不错。如果 EXIT_DATE 上有索引,它将被使用(如果优化器选择它)。如果它不存在,请创建它。这是否会是一个改进,很难说——你应该检查解释计划,看看有什么不同。但是,一般来说,是的 - 它看起来不错。 查询看起来不错。你想定期运行它吗?那么你不需要EXIT_DATE &gt;= TRUNC(SYSDATE-3)。正如 Littlefoot 提到的,您可能会从此处的索引中受益。试试create index idx1 on ctr_qwe(status, exit_date);create index idx2 on ctr_qwe(exit_date, status); 看看其中一个是否被使用。 您的查询很好。 【参考方案1】:

代码很好。我只建议同时添加截断您的 EXIT_DATE,因为您已经在截断要与之比较的日期。

当您需要为同一日期编写间隔时,最好使用 BETWEEN AND 在这种情况下。那个在输出上没有真正的区别,但可读性更好。

所以:

UPDATE CTR_QWE
   SET STATUS = 'COMPLETED'
 WHERE STATUS IN ('N', 'P') 
   AND TRUNC(EXIT_DATE) BETWEEN TRUNC (SYSDATE - 3) AND TRUNC (SYSDATE - 1);

【讨论】:

性能方面没有任何改进。您的更新语句要么与原始语句一样快,要么更慢。只有在 TRUNC(EXIT_DATE) 上提供函数索引时,您的才能更快。 @ThorstenKettner 你是对的,考虑到这一点,引擎必须将BETWEEN AND 翻译成两次AND&gt;=&lt;=。因此,应该没有改进或差异。但是,为什么你认为BETWEEN AND 会更慢? TRUNC(EXIT_DATE) 可能会更慢,因为它会阻止使用EXIT_DATE 上的可能索引。 @ThorstenKettner 啊哈,好的,您在提到性能时一直在​​引用 TRUNC。当然,TRUNC 不会增加性能(如果没有别的,这是要执行的额外操作......),但我确实认为这是一个很好的做法(将日期与已经截断的日期进行比较时)。所以我在提到性能时并没有引用TRUNC,而是在我写的关于“BETWEEN ALL”的单独段落中说明了这一点。我也从那里删除了它,因为你的评论让我思考了超过一秒钟,意识到引擎正在将它翻译成相同的代码。谢谢你。 我强烈反对将between 与日期/时间数据类型一起使用。当存在时间组件时,它通常会出现意外行为。 OP的原版更可取。

以上是关于更新所有过去 3 天的记录的主要内容,如果未能解决你的问题,请参考以下文章

每天更新过去 7 天的记录 [重复]

查看过去 30 天的所有使用情况,按用户和滚动分组

LINQ 查询以获取过去 30 天的记录

PHP - 如何从 MySQL 中选择过去 30 天的记录 [重复]

过去 30 天的平均值,不包括当前记录(混合日期和基于行的条件)

sql语句从数据库中获取恰好过去5天的数据