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
是字符串(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),这肯定会失败。
我和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
是字符串(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),这肯定会失败。