복붙노트

[SQL] JDBC 결과 : 저는 getDateTime 필요하지만 GETDATE 및 getTimeStamp이있다

SQL

JDBC 결과 : 저는 getDateTime 필요하지만 GETDATE 및 getTimeStamp이있다

나는 JDBC와 오라클 DB 테이블에서 DATETIME 열을 좀하고 싶습니다. 여기 내 코드는 다음과 같습니다

int columnType = rsmd.getColumnType(i);
if(columnType == Types.DATE)
{
    Date aDate = rs.getDate(i);
    valueToInsert = aDate.toString();
}
else if(columnType == Types.TIMESTAMP)
{
    Timestamp aTimeStamp = rs.getTimestamp(i);
    valueToInsert = aTimeStamp.toString();
}
else
{
    valueToInsert = rs.getString(i);
}

내가 먼저 열 유형을 식별해야합니다. "2009년 7월 5일 13시 49분 32초"필드 나는 Types.DATE로 인식되고 있습니다에 관심이 있지만, 정말 이후 DB에서 DATETIME입니다이 형식은

GETDATE는 시간을 잘라 : "2009년 5월 7일를" 및에는 getString은 추가 "0.0"그것 "2009년 5월 7일 13 : 49 : 32.0"

물론 난 그냥 모든 시간에는 getString으로 최종 0.0 및 작업을 제거 할 수 있지만, 더러운 해결 방법입니다.

어떤 아이디어? 나는 getDateTime 방법을 찾고 있었다.

건배, 팀

해결법

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

    1.

    java.util.Date date;
    Timestamp timestamp = resultSet.getTimestamp(i);
    if (timestamp != null)
        date = new java.util.Date(timestamp.getTime()));
    

    그럼 당신이 원하는 방식으로 포맷합니다.

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

    2.레오 Literak에 의한 대답은 정확하지만 지금은 골칫거리 된 날짜 - 시간 클래스 중 하나의 java.sql.Timestamp 사용, 구식.

    레오 Literak에 의한 대답은 정확하지만 지금은 골칫거리 된 날짜 - 시간 클래스 중 하나의 java.sql.Timestamp 사용, 구식.

    아니, 그렇지 않습니다. Oracle 데이터베이스에서 DATETIME으로 이러한 데이터 형식이 없습니다.

    JDBC 4.2을 사용 java.time 클래스와 나중에보다는 당신의 질문에서 볼 귀찮은 기존 클래스. 특히, 다소의 java.sql.Timestamp, 잠시 사용 즉시 클래스에 비해 같은 SQL 표준 유형 TIMESTAMP WITH TIME ZONE있다.

    인위적인 코드 :

    if( 
        JDBCType.valueOf( 
            myResultSetMetaData.getColumnType( … )
        )
        .equals( JDBCType.TIMESTAMP_WITH_TIMEZONE ) 
    ) {
        Instant instant = myResultSet.getObject( … , Instant.class ) ;
    }
    

    이상하게도는 JDBC 4.2 사양은 두 개의 가장 일반적으로 사용되는 java.time 클래스, 인스턴트 및 ZonedDateTime에 대한 지원을 필요로하지 않습니다. 당신의 JDBC 위에서 본 코드를 지원하지 않는 경우 그래서, 대신 OffsetDateTime를 사용합니다.

    OffsetDateTime offsetDateTime = myResultSet.getObject( … , OffsetDateTime.class ) ;
    

    이 문서에 따르면, 오라클 데이터베이스에는 열 데이터 형식 DATETIME가 없습니다. 그 용어는 그룹으로 모든 날짜 - 시간 유형을 참조하는 오라클의 말씀 것으로 보인다.

    나는 어떤 데이터 형의 종류와 가지를 감지 코드의 지점을 볼 수 없습니다. 일반적으로, 나는 당신이 특정 테이블과 특정 비즈니스 문제의 맥락에서 명시 적으로 코드를 공예해야한다고 생각합니다. 아마도 이것은 일반적인 프레임 워크의 일종에 유용 할 것입니다. 당신이 주장하는 경우, 다양한 유형에 대해 배울 읽어 및 Java 8로 나중에 대신하는 클래스가 귀하의 질문에 사용 된 내장 된 매우 유용한 새로운 java.time 클래스에 대해 배울 수 있습니다.

    당신은 문자열 객체로, 텍스트로 데이터베이스에 날짜 - 시간 값을 교환하려고에 나타납니다. 하지 마십시오.

    데이터베이스, 사용 날짜 - 시간 객체와 날짜 - 시간 값을 교환합니다. 이제 자바 8 이상 그 수단 java.time 객체, 후술하는 바와 같이.

    당신은 날짜 - 시간 관련 데이터 유형의 3 개 세트 혼동 될 수 있습니다 :

    표준 SQL 다섯 가지 유형을 정의한다 :

    많은 데이터베이스를 제공 자신의 날짜 - 시간 관련 유형. 독점 종류가 다양. 일부는 피해야한다 이전, 기존의 유형입니다. 일부는 특정 혜택을 제공하는 공급 업체 믿어진다; 당신은 단지 여부를 표준 유형을 고수 할 것인지 여부를 결정합니다. 주의 : 일부 독점 유형은 표준 타입과 충돌 이름이; 난 당신 오라클 DATE 찾고 있어요.

    자바 플랫폼의 핸들 다르게 SQL 표준 또는 특정 데이터베이스를보다 날짜 - 시간의 내부 세부 사항. JDBC 드라이버의 작업은 필요에 따라 형태와 실제 구현되는 데이터 값을 변환하는 브리지 역할을하도록, 이러한 차이점을 중재하는 것이다. 주는 java.sql. * 패키지는 다리입니다.

    자바 (8) 이전에, JDBC 스펙은 날짜 - 시간 작업을 위해 3 가지를 정의했다. 버전 8 이전에, Java는 날짜 만 또는 시간 전용 값을 표현하기 위해 어떤 클래스를 결여로 처음 두 해킹입니다.

    즉, ResultSet 인터페이스에는 "getDateTime"방법과 관련없는 질문에 대답 그래서. 그 인터페이스 이벤트 JDBC에 정의 된 세 가지 브리징 데이터 유형에 대한 방법을 게터 :

    (가) 첫째 시간대의 개념이 부족하거나 오프셋에서-UTC합니다. 마지막 하나의 java.sql.Timestamp는 toString 메소드가 당신을 알려줍니다 무엇에도 불구하고 항상 UTC입니다.

    당신은 위에 나열된 가난하게 디자인 된 JDBC 클래스를 피해야한다. 그들은 java.time 유형으로 대체된다.

    JDBC 4.2 이상, 당신은 직접 java.time이 당신의 데이터베이스 객체를 교환 할 수 있습니다. 사용의 setObject /으로 getObject 방법.

    삽입 / 업데이트.

    myPreparedStatement.setObject( … , instant ) ;
    

    검색.

    Instant instant = myResultSet.getObject( … , Instant.class ) ;
    

    인스턴트 클래스는 (소수의 분수의 구 (9) 자리) 나노초의 해상도를 가진 UTC의 타임 라인에 잠시 시간을 나타냅니다.

    특정 지역의 사람들에 의해 사용되는 벽 시계 시간을 통해 볼 때 오히려 UTC로보다 (시간대)를 인스턴트의 순간을보고 싶은 경우 ZonedDateTime 객체를 얻기 위해 ZoneId을 적용하여 조정한다.

    ZoneId zAuckland = ZoneId.of( "Pacific/Auckland" ) ;
    ZonedDateTime zdtAuckland = instant.atZone( zAuckland ) ;
    

    얻어진 ZonedDateTime 객체가 동일한 순간에, 타임 라인에 동시에 동일한 포인트이다. 날짜와 시간의 일이 다를 수 있으므로, 동쪽으로 새로운 일 새벽 이전. 예를 들어, 뉴질랜드에서 자정 이후 몇 분 UTC 여전히 "어제"입니다.

    당신은 적용 할 수 있습니다 아직 인스턴트 또는 ZonedDateTime 중 하나에 다른 시간대가 다른 지역의 사람들에 의해 사용되는 또 다른 벽 시계 시간을 통해 같은 동시 순간을 볼 수 있습니다.

    ZoneId zMontréal = ZoneId.of( "America/Montreal" ) ;
    ZonedDateTime zdtMontréal = zdtAuckland.withZoneSameInstant( zMontréal ) ;  // Or, for the same effect: instant.atZone( zMontréal ) 
    

    그래서 지금 우리는 세 가지 오브젝트 (인스턴트, zdtAuckland, zMontréal) 타임 라인에 모두 같은 순간을 나타내는, 같은 지점을 가지고있다.

    전문의 (a)는 나의 필드, (b)는 내가 (C)를 언급 한 상위로이를 방지 및 것입니다 당신이 주장하는 경우주의 : 데이터베이스의 데이터 형을 검출에 대한 질문에 코드를 다시 얻으려면 자바 (8) 이후로는 java.sql.Types로 클래스는 시대에 뒤 떨어진된다. 그 클래스는 이제 JDBCType의 적절한 자바 열거 그 구현하는 새로운 인터페이스 SQLTYPE로 대체됩니다. 관련 질문이 대답을 참조하십시오.

    이러한 변화는 JDBC 유지 보수 릴리스 4.2에 나열되어, 섹션 3 4. 인용 :

    열거 형은 기존의 클래스와 동일한 값을 가지고 있지만, 지금은 형식 안전성을 제공합니다.

    구문에 대한주의 사항 : 현대 자바에서, 당신은 열거 객체에 스위치를 사용할 수 있습니다. 필요가 귀하의 질문에서 볼 경우-다음 문을 계단식 사용 없습니다 그래서. 한 캐치 약간 애매한 기술적 인 이유로 전환 할 때 당신은 자격을 갖춘 JDBCType.TIMESTAMP_WITH_TIMEZONE보다는 TIMESTAMP_WITH_TIMEZONE에 스위치를 수행해야하므로 열거 객체의 이름, 자격이 사용되어야한다는 것입니다. 정적 import 문을 사용합니다.

    그래서입니다 모두가 다음 코드 예제처럼 뭔가를 할 수 있습니다 (나는 아직 시도하지 않은 한) 것 같아요라고합니다.

    final int columnType = myResultSetMetaData.getColumnType( … ) ;
    final JDBCType jdbcType = JDBCType.valueOf( columnType ) ;
    
    switch( jdbcType ) {  
    
        case DATE :  // FYI: Qualified type name `JDBCType.DATE` not allowed in a switch, because of an obscure technical issue. Use a `static import` statement.
            …
            break ;
    
        case TIMESTAMP_WITH_TIMEZONE :
            …
            break ;
    
        default :
            … 
            break ;
    
    }
    

    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, 더 여기에 몇 가지 유용한 클래스를 찾을 수 있습니다.

    업데이트 : 이제 유지 보수 모드에서 Joda 타임 프로젝트는의 java.time 클래스로 마이그레이션을 조언한다. 이 섹션에서는 역사로 그대로 유지.

    8 (java.time. * 패키지) 자바에 앞서, 자바와 함께 번들로 날짜 - 시간 클래스 (java.util.Date 및 일정, java.text.SimpleDateFormat에)는 악명 번잡, 혼란, 그리고 결함이 있습니다.

    더 좋은 방법은 당신의 JDBC 드라이버를 제공하고 그에서, Joda-시간 객체 또는 Java 8 java.time을 만들 것을 걸릴 것입니다. * 패키지로 제공된다. 결국, 당신은 자동으로 새 java.time을 사용하여 새 JDBC 드라이버를 볼 수 있습니다. * 클래스를. 그때까지 몇 가지 방법은 toInstant 및 fromInstant 등 java.time 등으로 끼어에 등을 java.sql.Timestamp 같은 클래스에 추가되었습니다.

    String를 렌더링 질문의 후반 부분에 관해서는 ... 포맷터 객체는 문자열 값을 생성하는 데 사용되어야한다.

    구식 방법은 java.text.SimpleDateFormat에와있다. 추천하지 않습니다.

    Joda 타임은 다양한 제공 포매터 내장, 당신은 또한 자신을 정의 할 수 있습니다. 그러나 로그 또는 당신이 언급 한대로 보고서를 작성하기위한, 최선의 선택은 ISO 8601 형식이 될 수 있습니다. 그 형식은 Joda-시간과 java.time에서 사용하는 기본값으로 발생합니다.

    //java.sql.Timestamp timestamp = resultSet.getTimestamp(i);
    // Or, fake it 
    // long m = DateTime.now().getMillis();
    // java.sql.Timestamp timestamp = new java.sql.Timestamp( m );
    
    //DateTime dateTimeUtc = new DateTime( timestamp.getTime(), DateTimeZone.UTC );
    DateTime dateTimeUtc = new DateTime( DateTimeZone.UTC ); // Defaults to now, this moment.
    
    // Convert as needed for presentation to user in local time zone.
    DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris");
    DateTime dateTimeZoned = dateTimeUtc.toDateTime( timeZone );
    

    콘솔에 덤프 ...

    System.out.println( "dateTimeUtc: " + dateTimeUtc );
    System.out.println( "dateTimeZoned: " + dateTimeZoned );
    

    실행하면 ...

    dateTimeUtc: 2014-01-16T22:48:46.840Z
    dateTimeZoned: 2014-01-16T23:48:46.840+01:00
    
  3. ==============================

    3.이 일 :

    이 일 :

        Date date = null;
        String dateStr = rs.getString("doc_date");
        if (dateStr != null) {
            date = dateFormat.parse(dateStr);
        }
    

    하여 SimpleDateFormat을 사용.

  4. ==============================

    4.을 선택했다 솔루션의 I는 MySQL의 쿼리 날짜를 포맷하는 것이 었습니다 :

    을 선택했다 솔루션의 I는 MySQL의 쿼리 날짜를 포맷하는 것이 었습니다 :

    String l_mysqlQuery = "SELECT DATE_FORMAT(time, '%Y-%m-%d %H:%i:%s') FROM uld_departure;"
    l_importedTable = fStatement.executeQuery( l_mysqlQuery );
    System.out.println(l_importedTable.getString( timeIndex));
    

    나는 똑같은 문제를 가지고 있었다. 내 MySQL의 테이블이 날짜를 포함하더라도 같은 형식 : 2017년 1월 1일 21시 2분 50초

    String l_mysqlQuery = "SELECT time FROM uld_departure;"
    l_importedTable = fStatement.executeQuery( l_mysqlQuery );
    System.out.println(l_importedTable.getString( timeIndex));
    

    같은 형식의 날짜를 반환했습니다 : 2017년 1월 1일 21 : 02 : 50.0

  5. from https://stackoverflow.com/questions/21162753/jdbc-resultset-i-need-a-getdatetime-but-there-is-only-getdate-and-gettimestamp by cc-by-sa and MIT license