【发布时间】:2009-08-14 09:05:48
【问题描述】:
我有这个 JDBC SQL 查询:
select *
from table
where TX_DATE = {d '2009-01-05'} and TX_TIME = {t '15:23:39'}
这会返回一些行。请注意,由于 Oracle 没有 TIME 类型,因此两列都是 DATE 类型。
但是当我使用 JDBC 参数时它失败了:
select *
from table
where TX_DATE = ? and TX_TIME = ?
第一个参数是new java.sql.Date(...),第二个参数是new java.sql.Time(...)。我将两个参数都打印到标准输出,它们看起来不错,所以值是正确的。但我没有得到任何行。为什么? {t '15:23:39'} 和 new java.sql.Time() 有什么区别?
[编辑] 这是填写PreparedStatement的代码:
public static void setParameters (final PreparedStatement stmt,
final Object... param)
{
for (int i=0; i<param.length; i++)
{
Object debug = param[i];
String type = null;
if (param[i] == null)
stmt.setString(i+1, null);
else if (param[i] instanceof java.sql.Time)
stmt.setTime (i+1, (java.sql.Time)param[i]);
我在setTime() 中设置了一个断点,它会被调用。 param[1].toString() 打印出15:23:39,所以我知道这个值是正确的。
我的猜测是,由于Oracle没有TIME类型,所以驱动程序中存在错误,并且没有忽略时间的DATE部分。
如果我在整张桌子上使用select *,我会得到
TX_DATE TX_TIME
2009-01-08 2009-08-01
如您所见,默认情况下时间列被视为日期。如果我使用TO_CHAR(TX_TIME, 'HH24:MI:SS'),我会得到:
TX_DATE TX_TIME
2009-01-08 15:23:39
2009-08-01 来自哪里?
【问题讨论】: