Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle where子句中的日期差=0?_Sql_Oracle_Date Arithmetic - Fatal编程技术网

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

Sql Oracle where子句中的日期差=0?,sql,oracle,date-arithmetic,Sql,Oracle,Date Arithmetic,我和你有同样的问题。唯一的区别是我使用Oracle。我想选择插入日期为2018年11月20日的行。所以我的问题是 select * from table where insertion_date='20.11.2018' 在那个问题上,他们建议使用datediff,所以我研究了它在oracle中的等价物,我知道我可以做日期算术。所以我试过这样的方法: select * from table where insertion_date -'20.11.2018'=0; 它给出了ora-0093

我和你有同样的问题。唯一的区别是我使用Oracle。我想选择插入日期为2018年11月20日的行。所以我的问题是

select * from table where insertion_date='20.11.2018'
在那个问题上,他们建议使用
datediff
,所以我研究了它在oracle中的等价物,我知道我可以做日期算术。所以我试过这样的方法:

select * from table where insertion_date -'20.11.2018'=0; 
它给出了
ora-00932不一致的数据类型预期日期获取编号

所以我就试了,

select * from table where insertion_date - to_date('20.11.2018', 'dd.MM.YYYY') = 0;
它不会给出错误,但也不会显示我知道肯定存在的结果。我做错了什么?谢谢


更新:对不起,我忘了提到
插入日期
的类型是
日期
。但它也有时间(小时、分钟、秒)信息。

插入日期的数据类型是什么

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

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

但它会破坏该列上的索引(除非它是基于函数的索引)。对于小桌子来说,这没什么区别。对于大量数据,它会将其转换为

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

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

在OracleI中,所有日期值都包含一个时间分量,应该说“其时间分量不同于00:00”。好的,谢谢@Littlefoot。您提供的第二个解决方案对我很有效。@csel-正如Littlefoot所说,第二个解决方案将是“您在该列上的破产指数”。如果您不想扫描表中的每一行,那么第三种解决方案是可行的。如果在插入日期列上有索引,则会产生不同。如果没有,则不会发生什么事情,因为查询无论如何都必须扫描整个表。但是,如果您经常在查询中使用该列,请考虑对其进行索引。
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'
select * from table where to_date(insertion_date, 'dd.mm.yyyy') = date '2018-11-20'