我有这个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(...)
。我将这两个参数打印到stdout并且看起来很好,所以值是正确的。但我没有得到任何行。为什么? {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
来自哪里?
答案 0 :(得分:3)
Oracle没有时间的Java类型。 java.sql.Time类映射到oracle.sql.DATE类,即使在最新的驱动程序中也是如此。 Documentation Here你应该做的是让TX_TIME的“日”部分成为一些标准值(比如1970-01-01)。然后,您可以使用静态“日期”查询此列,并使时间按预期工作。
根据您使用的Oracle驱动程序版本,Oracle DATE列类型的java.sql.Date和java.sql.Timestamp的处理方式不同。查看JDBC FAQ了解详情。祝你好运!
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.Timestamp.valueof("1970-01-01 " + param[i] + ".000000000")
);
}
答案 1 :(得分:0)
我假设您在此使用PreparedStatement
?
PrepapredStatement stmt = conn.prepareStatement(
"select * from table where TX_DATE = ? and TX_TIME = ?")
stmt.setDate(1, new java.sql.Date(myDate.getTime));
stmt.setTimestamp(2, new java.sql.Timestamp(myDate.getTime));
ResultSet rs = stmt.executeQuery();