복붙노트

[SQL] PreparedStatement의에하여 setDate 사용

SQL

PreparedStatement의에하여 setDate 사용

우리의 코드를보다 표준 만들기 위해, 우리는 우리가 대신 준비된 문 및 바인드 변수에 우리의 SQL 변수를 하드 코딩 모든 장소를 변경했다.

나는 그러나하여 setDate에 문제에 직면하고있다 ().

여기에 코드입니다 :

        DateFormat dateFormatYMD = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        DateFormat dateFormatMDY = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        Date now = new Date();
        String vDateYMD = dateFormatYMD.format(now);
        String vDateMDY = dateFormatMDY.format(now);
        String vDateMDYSQL =  vDateMDY ;
        java.sql.Date date = new java.sql.Date(0000-00-00);

   requestSQL = "INSERT INTO CREDIT_REQ_TITLE_ORDER (REQUEST_ID," + 
                " ORDER_DT, FOLLOWUP_DT) " +  "values(?,?,?,)";


                prs = conn.prepareStatement(requestSQL);

                prs.setInt(1,new Integer(requestID));

                prs.setDate(2,date.valueOf(vDateMDYSQL));
                prs.setDate(3,date.valueOf(sqlFollowupDT));

나는 SQL이 실행됩니다이 오류가 발생합니다 :

    java.lang.IllegalArgumentException
    at java.sql.Date.valueOf(Date.java:138)
    at com.cmsi.eValuate.TAF.TAFModuleMain.CallTAF(TAFModuleMain.java:1211)

내가 대신 TO_DATE와) setString 등을 (사용해야합니까 ()?

해결법

  1. ==============================

    1.테이블은 유형 DATE의 열이있는 경우 :

    테이블은 유형 DATE의 열이있는 경우 :

    테이블의 유형은 TIMESTAMP 또는 DATETIME의 열이있는 경우 :

  2. ==============================

    2.나중에 JDBC 4.2와 자바 8 이상 :

    나중에 JDBC 4.2와 자바 8 이상 :

    myPreparedStatement.setObject( … , myLocalDate  )
    

    …과…

    myResultSet.getObject( … , LocalDate.class )
    

    바 가스에 의한 답변 java.time 유형을 언급 대한 좋은하지만 java.sql.Date로 전환을 의미한다. 드라이버가 업데이트되면 필요가 변환 없습니다.

    java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 java.util.Date, .Calendar, java.text.SimpleDateFormat에로 이전 귀찮은 날짜 - 시간의 수업을 대신하다. Joda 타임 팀은 java.time로 마이그레이션을 조언한다.

    더 많은 내용은 오라클 자습서를 참조하십시오. 그리고 많은 예제와 설명은 스택 오버플로를 검색 할 수 있습니다.

    많은 java.time 기능은 ThreeTen - 백 포트 자바 6 7 백 포팅 또한 ThreeTenABP 안드로이드하도록 구성된다.

    java.time에서 java.time.LocalDate 클래스는 시간 - 일 - 중 및 시간대없이없이 날짜 만 값을 나타냅니다.

    JDBC 4.2 이상 사양과 JDBC 드라이버 준수를 사용하는 경우, 필요 이전 java.sql.Date 클래스를 사용할 수 없습니다. 당신은 / 통과 LOCALDATE이 PreparedStatement의 ::의 setObject와의 ResultSet ::으로 getObject를 통해 데이터베이스에서 /에 직접 객체를 가져올 수 있습니다.

    LocalDate localDate = LocalDate.now( ZoneId.of( "America/Montreal" ) );
    myPreparedStatement.setObject( 1 , localDate  );
    

    …과…

    LocalDate localDate = myResultSet.getObject( 1 , LocalDate.class );
    

    드라이버가 직접 java.time 유형을 처리 할 수없는 경우, java.sql의 유형으로 변환에 다시 가을. 하지만 당신의 비즈니스 로직은 java.time 유형을 사용하여, 사용을 최소화합니다.

    새로운 방법은 java.time 유형에서 /로 변환 기존의 클래스에 추가되었습니다. java.sql.Date 위해 valueOf 및 toLocalDate 방법을 참조하십시오.

    java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
    

    …과…

    LocalDate localDate = sqlDate.toLocalDate();
    

    귀하의 질문의 코드와 같이 자리 표시 자 값으로 0000-00-00을 사용하여주의하십시오. 모든 데이터베이스 및 기타 소프트웨어는 시간에 멀리 뒤로가는 처리 할 수 ​​있습니다. 나는 1970 1970-01-01의 일반적으로 사용되는 유닉스 /하여 Posix 시대 참조 날짜 같은 것을 사용하는 것이 좋습니다.

    LocalDate EPOCH_DATE = LocalDate.ofEpochDay( 0 ); // 1970-01-01 is day 0 in Epoch counting.
    

    java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 java.util.Date, 캘린더, 및 SimpleDateFormat에로 번잡 한 기존 레거시 날짜 - 시간의 수업을 대신하다.

    Joda 타임 프로젝트는 현재 유지 관리 모드에서 java.time 클래스로 마이그레이션을 조언한다.

    더 많은 내용은 오라클 자습서를 참조하십시오. 그리고 많은 예제와 설명은 스택 오버플로를 검색 할 수 있습니다. 사양은 JSR 310입니다.

    당신은 java.time은 데이터베이스와 객체를 직접 교환 할 수 있습니다. 나중에 JDBC 4.2와 JDBC 드라이버 규격을 사용합니다. 문자열에 대한 필요가 없습니다, java.sql의에 대한 필요가 없습니다. * 클래스.

    어디 java.time 클래스를 얻기 위해?

    ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가를위한 시험장이다. 당신은 같은 간격, YearWeek, YearQuarter, 더 여기에 몇 가지 유용한 클래스를 찾을 수 있습니다.

  3. ==============================

    3.당신이 겪고있는 문제는 당신이 그들이 사용하기 때문에 따라 valueOf (사용하는 경우 같은 방식으로 동작하지 않는 java.sql.Date의 인스턴스를) 구성하는 형식의 java.util.Date에서 호환되지 않는 형식을 전달하는 것입니다 다른 형식.

    당신이 겪고있는 문제는 당신이 그들이 사용하기 때문에 따라 valueOf (사용하는 경우 같은 방식으로 동작하지 않는 java.sql.Date의 인스턴스를) 구성하는 형식의 java.util.Date에서 호환되지 않는 형식을 전달하는 것입니다 다른 형식.

    나는 또한 당신이 시간과 분을 유지하는 것을 목표로하고 있음을 볼 수있다, 나는 DATETIME 또는 유사한으로 데이터베이스 필드를 변경과 함께, 당신은 더 나은 시간과 분을 지원을 java.sql.Timestamp에 데이터 형식을 변경 거라고 생각 (데이터베이스 공급 업체에 따라 다름).

    당신이 java.sql.Date에 java.util.Date에서 변경하려면 어쨌든, 내가 사용 제안

    java.util.Date date = Calendar.getInstance().getTime();
    java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 
    // ... more code here
    prs.setDate(sqlDate);
    
  4. ==============================

    4.워드 프로세서 명시 적으로 java.sql.Date가 발생합니다 말합니다 :

    워드 프로세서 명시 적으로 java.sql.Date가 발생합니다 말합니다 :

    또한 당신이 sql.date에 다음 문자열로 날짜를 변환 할 필요가 없습니다, 이것은 불필요한 것 (그리고 버그가 발생하기 쉬운!). 대신 당신은 할 수 :

    java.sql.Date sqlDate := new java.sql.Date(now.getTime());
    prs.setDate(2, sqlDate);
    prs.setDate(3, sqlDate);
    
  5. ==============================

    5.데이터베이스에 현재 날짜를 추가 할 경우, I로 시작하는 자바의 날짜를 계산하지 않도록한다. 결정 "지금"에 자바 (클라이언트) 데이터베이스에서 가능한 불일치로 측 리드 클라이언트 측 인 경우 잘못 구성된, 대신, 날짜가있는 서버 측에서 설정할 수있는 잘못된 시간, 잘못된 시간대 등이있다 다음과 같은 방법 :

    데이터베이스에 현재 날짜를 추가 할 경우, I로 시작하는 자바의 날짜를 계산하지 않도록한다. 결정 "지금"에 자바 (클라이언트) 데이터베이스에서 가능한 불일치로 측 리드 클라이언트 측 인 경우 잘못 구성된, 대신, 날짜가있는 서버 측에서 설정할 수있는 잘못된 시간, 잘못된 시간대 등이있다 다음과 같은 방법 :

    requestSQL = "INSERT INTO CREDIT_REQ_TITLE_ORDER ("   +
                    "REQUEST_ID, ORDER_DT, FOLLOWUP_DT) " +
                    "VALUES(?, SYSDATE, SYSDATE + 30)";
    
    ...
    
    prs.setInt(1, new Integer(requestID));
    

    이 방법은, 하나의 바인드 매개 변수가 필요하고, 날짜가 일치하는 서버 측에서 계산됩니다. 더 좋은 점은 CREDIT_REQ_TITLE_ORDER에 삽입 트리거를 추가하고 날짜 삽입 트리거를하는 것입니다. 그 캔 도움이 누군가가 SQLPLUS를 통해 수정을하려고, 예를 들어, 다른 클라이언트 응용 프로그램 (사이에 일관성을 적용합니다.

  6. ==============================

    6.확실하지,하지만 난 당신이 찾고있는 생각하는 것은 다음 문자열에서 java.util.Date를 만들 java.util.Date 그의 java.sql.Date로 변환하는 것입니다.

    확실하지,하지만 난 당신이 찾고있는 생각하는 것은 다음 문자열에서 java.util.Date를 만들 java.util.Date 그의 java.sql.Date로 변환하는 것입니다.

    이 시도:

    private static java.sql.Date getCurrentDate(String date) {
    
        java.util.Date today;
        java.sql.Date rv = null;
        try {
    
            SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
            today = format.parse(date);
            rv = new java.sql.Date(today.getTime());
            System.out.println(rv.getTime());
    
        } catch (Exception e) {
            System.out.println("Exception: " + e.getMessage());
        } finally {
            return rv;
        }
    
    }    
    

    하여 setDate ()에 대한 java.sql.Date 객체를 반환합니다;

    이 함수는 위의 long 값을 출력 할 것이다 :

    1375934400000

  7. from https://stackoverflow.com/questions/18614836/using-setdate-in-preparedstatement by cc-by-sa and MIT license