更新所有过去 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 >= 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
与>=
和<=
。因此,应该没有改进或差异。但是,为什么你认为BETWEEN AND
会更慢?
TRUNC(EXIT_DATE)
可能会更慢,因为它会阻止使用EXIT_DATE
上的可能索引。
@ThorstenKettner 啊哈,好的,您在提到性能时一直在引用 TRUNC
。当然,TRUNC
不会增加性能(如果没有别的,这是要执行的额外操作......),但我确实认为这是一个很好的做法(将日期与已经截断的日期进行比较时)。所以我在提到性能时并没有引用TRUNC
,而是在我写的关于“BETWEEN ALL”的单独段落中说明了这一点。我也从那里删除了它,因为你的评论让我思考了超过一秒钟,意识到引擎正在将它翻译成相同的代码。谢谢你。
我强烈反对将between
与日期/时间数据类型一起使用。当存在时间组件时,它通常会出现意外行为。 OP的原版更可取。以上是关于更新所有过去 3 天的记录的主要内容,如果未能解决你的问题,请参考以下文章
PHP - 如何从 MySQL 中选择过去 30 天的记录 [重复]