JDBC setDate不与preparedstatement一起使用

时间:2012-01-20 13:48:08

标签: date jdbc prepared-statement

我是Java JDBC的新手。我正在尝试创建一个JDBC preparedstatement来在两个Oracle DATE值之间执行SELECT。 我知道这两次之间存在数据,因为我可以直接进行查询。

但是,当我从JDBC代码中执行预准备语句时,它返回0行。

我的输入开始和时间是长Unix时间值,以毫秒为单位。

我试图将代码削减到最低限度:

public static List<Oam1731Sam5Data> getData(Long startTime, Long endTime) {
    try {
        String query = "SELECT timecaptured from oam1731data5 " +
            "WHERE timecaptured between ? and ?";

        pstmt = conn.prepareStatement(query); // create a statement

        Date javaStartDate = new Date(startTime);
        Date javaEndDate = new Date(endTime);

        pstmt.setDate(1, javaStartDate);
        pstmt.setDate(2, javaEndDate);

        ResultSet rs = pstmt.executeQuery();

        while (rs.next()) {
            String serviceId =  rs.getString("SERVICEID");
            String recordSource = rs.getString("RECORDSOURCE");
            Date timeCaptured = rs.getDate("TIMECAPTURED");
            Long oneWayMaxDelay = rs.getLong("ONEWAYMAXDELAY");
            Long twoWayMaxDelay = rs.getLong("TWOWAYMAXDELAY");
            Long twoWayMaxDelayVar = rs.getLong("TWOWAYMAXDELAYVAR");
            Long packetLoss = rs.getLong("PACKETLOSS");
        }

    } catch (SQLException se) {
        System.err.println("ERROR: caught SQL exception, code: " + se.getErrorCode() + 
                ", message: " + se.getMessage());
    }

问题是这会返回0行,同一查询返回数据:

从oam1731data5中选择insert_date,recordsource,serviceid,timecaptured,onewaymaxdelay,twowaymaxdelay,twowaymaxdelayvar,packetloss  在to_date之间捕获时间('2012-01-18 07:00:00','YYYY-MM-DD HH24:MI:SS')  和to_date('2012-01-18 08:00:00','YYYY-MM-DD HH24:MI:SS')  按insert_date排序

DBMS_OUTPUT:


INSERT_DATE RECORDSOURCE SERVICEID TIMECAPTURED ONEWAYMAXDELAY TWOWAYMAXDELAY TWOWAYMAXDELAYVAR PACKETLOSS


1/18/2012 10:43:36 AM EV TAMP20-MTRO-NID1SYRC01-MTRO-NID1 1/18/2012 7:25:24 AM 40822 79693 343 0
 1/18/2012 10:43:36 AM EV SYRC01-MTRO-NID1TAMP20-MTRO-NID1 1/18/2012 7:25:13 AM 39642 79720 334 0
 1/18/2012 10:43:36 AM EV TAMP20-MTRO-NID1SYRC01-MTRO-NID1 1/18/2012

我已经看过很多关于问题的帖子,但是还没有 能够找到钥匙了!

我想过尝试让我的查询使用一个字符串并简单地将我的日期转换为字符串,以便能够为Oracle TO_DATE函数插入它们,但似乎我不应该这样做。

这是我的println语句的输出。打印日期不显示时间部分是一个问题吗?

SQL查询:SELECT timettured from oam1731data5 WHERE timecaptured?和? Java Oracle日期:2012-01-18结束日期2012-01-18

提前感谢您的帮助。

米奇

2 个答案:

答案 0 :(得分:0)

java.sql.Date表示没有时间的日期。如果您关心时间部分,则必须使用时间戳。

javadoc of java.sql.Date说:

  

符合SQL DATE的定义,即毫秒值   由java.sql.Date实例包装必须通过设置'规范化'   小时,分钟,秒和毫秒为零   与实例关联的特定时区。

答案 1 :(得分:0)

使用日期作为开始日期和结束日期不应该导致任何问题。应该在该时间间隔内检索指定时间间隔内的数据(在这种情况下,应该检索那些在2012年1月18日插入的数据。)因此我不认为省略时间部分是你的问题。