在Oracle中按日期过滤时出现奇怪的行为

时间:2015-08-05 11:33:39

标签: oracle date to-date to-char

我在Oracle数据库上,以下查询:

select codi_belf, data_elab,id_inte,anno from mimsspam_tab where id_inte = 504;

检索6条记录

E924    05-AGO-15   504 2015
D458    05-AGO-15   504 2015
D458    05-AGO-15   504 2015
B275    05-AGO-15   504 2015
E924    05-AGO-15   504 2015
B275    05-AGO-15   504 2015

其中“data_elab”是DATE类型的字段,AGO只是AUG的意大利语语言环境。

我尝试按日期过滤:

select codi_belf, data_elab,id_inte,anno 
from mimsspam_tab where id_inte = 504 
and data_elab = TO_DATE('05/08/2015','dd/MM/yyyy');

我没有结果......

此外,如果我这样过滤:

select codi_belf, data_elab,id_inte,anno  
from mimsspam_tab where id_inte = 504 
and TO_CHAR(data_elab,'dd/MM/yyyy')='05/08/2015';

我收到了我的六条记录!

两种过滤方式不应该相同吗?他们为什么不呢?为什么第一个吃掉我的所有六个记录? 这可能取决于我要查询的oracle安装的奇怪配置吗?

2 个答案:

答案 0 :(得分:3)

听起来你的data_elab列有时间元素,当你选择那个列时,你的默认nls_date_format设置会导致不显示。

如果data_elab上没有索引,那么以下内容应该返回行:

and data_elab >= TO_DATE('05/08/2015','dd/MM/yyyy')
and data_elab < TO_DATE('06/08/2015','dd/MM/yyyy')

如果data_elab上有索引,并且您希望使用它,那么以下内容应该有效:

{{1}}

答案 1 :(得分:2)

您在第一个查询中看到的是您的数据库默认日期格式,由您的NLS参数决定。您的日期字段实际上包含时间信息,您只是看不到它。

在第二个查询中,当您使用to_date()时,您将string转换为date并且不提供时间信息,因此您获得了00:00:00时间部分date。将其与您的字段(包括时间信息)进行比较将导致不匹配。

在第三个查询中,当您使用to_char()时,您将日期字段转换为不包含时间信息的string。将其与文字string进行比较,即可获得匹配的记录。

尝试将日期字段视为二进制信息,而不是字符串。尽量不要依赖数据库默认参数。