以下查询返回的行多于在数据库中运行查询时的一行:
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
答案 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
LIKE
或DATE
列上使用TIMESTAMP
!