2012-01-20 3 views
0

저는 Java JDBC를 처음 접했습니다. 두 Oracle DATE 값 사이에서 SELECT를 수행하기 위해 JDBC preparedstatement를 작성하려고합니다. 쿼리를 직접 수행 할 수 있으므로이 두 시간 사이에 데이터가 있음을 알고 있습니다.JDBC setDate가 preparedstatement와 작동하지 않습니다.

그러나 JDBC 코드 내에서 prepared statement를 실행할 때 0 행을 반환합니다.

제 입력 시작 및 시간은 밀리 초 단위의 긴 유닉스 시간 값입니다.

나는 최소한에 코드를 깎다하는 것을 시도했다

:

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 년 1 월 18 일 07:00:00 ','YYYY-MM-DD HH24 : MI : SS ') 및 to_date ('2012 년 1 월 1 일부터 2012 년 12 월 31 일까지) 사이에 시간 캡처되는 의 패킷 손실 -01-18 08:00:00 ','YYYY-MM-DD HH24 : MI : SS ') 주문 입력 : insert_date

DBMS_OUTPUT :


2012년 1월 18일 오전 10시 43분 36초 EV TAMP20-MTRO-NID1SYRC01-MTRO-NID1 1


INSERT_DATE 레코드 원본 서비스 id TIMECAPTURED ONEWAYMAXDELAY TWOWAYMAXDELAY TWOWAYMAXDELAYVAR PACKETLOSS/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 2012 년 1 월 18 일

나는 이런 문제에 대해 많은 게시물을 보았지만 준비가되지 않았지만 수 있습니다 아직 열쇠를 찾지 못했다!

내 쿼리에서 문자열을 사용하고 단순히 내 날짜를 문자열로 변환하여 Oracle TO_DATE 함수에 삽입 할 수있게하려고 생각했지만이 작업을 수행하면 안됩니다.

그리고 여기 내 println 문 출력이 있습니다. 인쇄하는 날짜에 시간 부분이 표시되지 않는 것이 문제입니까?

SQL 쿼리 : select timecaptured from oam1731data5 어디에서 시간을 캡처합니까? 그리고? 자바 오라클 날짜 : 2012-01-18 종료일 2012-01-18

미리 도움을 청하십시오.

미치

답변

0

java.sql.Date 시간없이 날짜를 나타냅니다. 시간 부분을 염려한다면 타임 스탬프를 사용해야합니다.

javadoc of java.sql.Date

는 말한다 :

의 SQL DATE의 정의에 부합하기 위해, 밀리 초는 java.sql의 래핑 값.인스턴스가 연결된 특정 시간대 인 에서 시간, 분, 초 및 밀리 초를 0으로 설정하여 날짜 인스턴스를 '정규화'해야합니다.

0

시작일과 종료일에 날짜를 사용하면 문제가 발생하지 않습니다. 지정된 간격의 데이터는 해당 시간 간격으로 검색되어야합니다 (2012 년 1 월 18 일에 삽입 된 인쇄 된 데이터는이 경우 검색되어야합니다). 따라서 시간 부분을 생략하는 것이 문제.

+0

저는 그렇게 생각하지 않습니다. 기본적으로 쿼리는 날짜와 시간이 1/18/2012 00:00:00에서 1/18/2012 00:00:00 사이 인 모든 행을 검색합니다. 분명히, 어떤 것도 없습니다. –

+0

2012 년 1 월 18 일 00:00:00부터 1/18/2012 00:00:00 사이에 날짜가있는 모든 행을 쿼리가 검색하는지 모르겠습니다. 그렇다면 분명히 옳습니다. 이해하는 가장 좋은 방법은 시작일 날짜의 값을 변경하고 시도하는 것입니다. –

관련 문제