JDBC中的executeQuery()返回错误的行

时间:2016-12-09 15:20:27

标签: sql oracle jdbc prepared-statement

以下查询返回的行多于在数据库中运行查询时的一行:

select distinct employeeId as facilityId,0 as numberOfRequests 
from If_User 
where role='Facility Staff' 
and employeeId not in (select distinct facilityId 
                       from IF_Request 
                       where requestStatus='C' 
                         and allocationTime like '09-12-16%');

这在JDBC中返回:

FacilityID numberOfRequests

8585            0
7427            0
2545            0

SQLDeveloper中的实际数据是:

FacilityID numberOfRequests
8585            0
7427            0

IF_Request Table

IF_User Table

1 个答案:

答案 0 :(得分:3)

这是因为依赖于在LIKE列上使用DATE触发的隐式数据类型转换。对于字符值,LIKE LIKE强制Oracle将日期值转换为字符串。从SQL Developer运行时,其他规则适用于恶意隐式数据类型转换,然后在您通过应用程序运行时。

使用正确的日期文字,例如

where trunc(allocationtime) = date '2016-12-09'

如果需要是Java中的参数,请使用PreparedStatement并使用java.sql.Timestamp传递setTimestamp()的实例,不要为DATE或TIMESTAMP参数传递字符串值。

Oracle的日期始终包含时间部分,因此您必须对列值使用trunc()来将其标准化为00:00:00

切勿在{{1​​}},LIKEDATE列上使用TIMESTAMP