我和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_date
是date
类型。但其中也包含时间(小时,分钟,秒)信息。
答案 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
是字符串(VARCHAR2
或CHAR
)数据类型(这是一个非常糟糕的主意;请考虑切换到DATE
数据类型) ,那么您必须知道其格式,先将其转换为DATE
,然后再与另一个日期进行比较。例如,如果它是包含日期格式为dd.mm.yyyy
的字符串,则
select * from table where to_date(insertion_date, 'dd.mm.yyyy') = date '2018-11-20'
如果该列中的任何字符串与该格式不匹配或包含无效值(例如“ date” 53.67.Bx48),则肯定会失败。