Oracle where 子句中的日期差异 = 0?

Date difference = 0 in where clause Oracle?

我和this有同样的问题。唯一的区别是我使用 Oracle。我想要 select 具有 insertion_date='20.11.2018' 的行。所以我的查询是

select * from table where insertion_date='20.11.2018'

在那个问题中,他们建议 datediff,所以我查看了它在 oracle 中的等价物,我了解到我可以进行日期算术。所以我尝试了这样的事情:

select * from table where insertion_date -'20.11.2018'=0; 

它给了ora-00932 inconsistent datatypes expected date got number

所以,然后我尝试了;

select * from table where insertion_date - to_date('20.11.2018', 'dd.MM.YYYY') = 0;

它没有给出错误,但也没有显示我知道必须有的结果。我在这里做错了什么?谢谢。

更新: 对不起,我忘了说 insertion_date 是类型 date。但它也有时间(小时,分钟,秒)信息。

INSERTION_DATE 的数据类型是什么?

如果是DATE,则将其与另一个日期进行比较(注意:这是日期字面量;您使用的值是一个字符串!)

select * from table where insertion_date = date '2018-11-20'

可能有效,除非 INSERTION_DATE 包含时间部分(小时和分钟)。然后,最简单的选择是截断它的值(这样你就可以在午夜得到日期本身):

select * from table where trunc(insertion_date) = date '2018-11-20'

但它会破坏 你在该列上的索引(除非它是基于函数的索引)。对于小桌子,它不会有任何区别。对于大量数据,它会将其转换为

select * from table where insertion_date >= date '2018-11-20'
                      and insertion_date <  date '2018-11-21'

另一方面,如果 INSERTION_DATE 是字符串(VARCHAR2CHAR)数据类型(这是一个非常糟糕的主意;考虑切换到 DATE数据类型),那么你必须知道它的格式,先将其转换为 DATE 然后再与另一个日期进行比较。例如,如果它是一个包含格式为 dd.mm.yyyy 的日期值的字符串,则

select * from table where to_date(insertion_date, 'dd.mm.yyyy') = date '2018-11-20'

如果该列中的任何字符串与此类格式不匹配或包含无效值(例如 "date" 53.67.Bx48),这肯定会失败。