首页 > 解决方案 > 删除时找不到日期列

问题描述

我有这个不删除任何行的语句。

DELETE FROM mytable
WHERE
    datecolumn = sysdate + 100;

但是,正如我所料,下面的删除了 57K 行。为什么会这样?mytable 中的 Datecolumn 存储为 DATE 变量类型。

DELETE FROM mytable
WHERE
    to_char(datecolumn, 'DD/MM/YYYY') = to_char(sysdate + 100, 'DD/MM/YYYY');

标签: sqloracledml

解决方案


在 Oracle 中date——尽管它的名字——有一个时间组件。 sysdate-- 尽管它的名字 -- 也有一个时间组件。

因此,第一个版本正在比较日期和时间,并且没有匹配项。第二个是仅比较日期部分。

请注意,通常不需要将日期转换为字符串。

您可以编写第二个以获得更高的性能:

where datecolumn >= trunc(sysdate) + interval '100' day and
      datecolumn < trunc(sysdate) + interval '101' day;

这使得优化器更容易,因为列上没有函数。


推荐阅读