Oracle的where子句中的日期差= 0。

时间:2018-12-02 10:30:53

标签: sql oracle date-arithmetic

我和this有相同的问题。唯一的区别是我使用Oracle。我想选择具有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_datedate类型。但其中也包含时间(小时,分钟,秒)信息。

1 个答案:

答案 0 :(得分:3)

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'

,但是它将在该列上具有 ruin 索引(除非它是基于函数的索引)。对于小桌子,这没有任何区别。对于大量数据,它将因此转换为

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),则肯定会失败。