2012-01-20 28 views
0

我是Java JDBC的新手。我正在嘗試創建一個JDBC準備語句,以在兩個Oracle DATE值之間執行SELECT操作。 我知道這兩個時間之間存在數據,因爲我可以直接進行查詢。JDBC setDate與預處理語句不兼容

當我從我的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行,其中同一查詢返回的數據:

選擇insert_date,記錄源,服務ID ('2012-01-18 07:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2012),timecaptured,onewaymaxdelay,twowaymaxdelay,twowaymaxdelayvar,packetloss from oam1731data5 where timecaptured between to_date -01-18 08:00:00','YYYY-MM-DD HH24:MI:SS') order by insert_date

DBMS_OUTPUT:


INSERT_DATE記錄源SERVICEID TIMECAPTURED ONEWAYMAXDELAY TWOWAYMAXDELAY TWOWAYMAXDELAYVAR分組丟失


1/18/2012上午10點43分36秒EV TAMP20-硝基 - NID1SYRC01-硝基 - NID1 1 /二千零十二分之十八上午07點25分24秒40822 79693 343 0
1/18/2012上午10時43分36秒EV SYRC01-硝基 - NID1TAMP20-硝基 - NID1 1/18/2012上午07點25分13秒39642 79720 334 0
2012/1/18 10:43:36 EV TAMP20-MTRO-NID1SYRC01-MTRO-NID1 2012年1月18日

我已經看到並準備好了很多關於這個問題的帖子,但並不是 able找到鑰匙呢!

我想過試圖讓我的查詢使用字符串,只是我的日期轉換爲字符串能夠插入他們的Oracle TO_DATE功能,但好像我不應該這樣做。

這裏是我的println語句的輸出。打印日期不顯示時間部分是否是一個問題?

SQL查詢:從oam1731data5 timecaptured WHERE之間timecaptured?和? Java的Oracle日期:2012-01-18結束日期2012-01-18

預先感謝任何幫助。

米奇

回答

0

java.sql.Date表示沒有時間的日期。如果您關心時間部分,您必須使用時間戳。

javadoc of java.sql.Date說:

要與SQL DATE的定義一致,毫秒值 由java.sql中的包裹。日期實例必須通過將 小時,分鐘,秒和毫秒設置爲 與實例關聯的特定時區爲零來「標準化」。

0

使用日期開始和結束日期不應該導致任何問題。應該在該時間間隔內檢索指定時間間隔內的數據(這些數據在2012年1月18日插入的數據應在此情況下檢索)。因此,我認爲省略時間部分不是您的問題。

+0

我不認爲會。基本上,查詢搜索所有行的日期和時間爲2012年1月18日00:00:00至2012年1月18日00:00:00。顯然,沒有任何。 –

+0

我不確定該查詢是否搜索2012年1月18日00:00:00至2012年1月18日00:00:00之間的所有行。如果是這樣,你顯然是對的。要理解的最好方法是他改變開始日期的價值並嘗試。 –