JDBC:我如何在Oracle中按时间查询?

时间:2009-08-14 09:05:49

标签: java oracle jdbc

我有这个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来自哪里?

2 个答案:

答案 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();