[SQL] JDBC 결과 : 저는 getDateTime 필요하지만 GETDATE 및 getTimeStamp이있다
SQLJDBC 결과 : 저는 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.
java.util.Date date; Timestamp timestamp = resultSet.getTimestamp(i); if (timestamp != null) date = new java.util.Date(timestamp.getTime()));
그럼 당신이 원하는 방식으로 포맷합니다.
-
==============================
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.이 일 :
이 일 :
Date date = null; String dateStr = rs.getString("doc_date"); if (dateStr != null) { date = dateFormat.parse(dateStr); }
하여 SimpleDateFormat을 사용.
-
==============================
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
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
'SQL' 카테고리의 다른 글
[SQL] SQL은 어떻게 선택 반환 값을 바꾸려면? (0) | 2020.06.25 |
---|---|
[SQL] Oracle 용으로 생성 SQL 삽입 (0) | 2020.06.25 |
[SQL] 왼쪽에 참여 이용한 1 대 다수의 관계에서 첫 번째 레코드를 선택 (0) | 2020.06.25 |
[SQL] 검색어 "사이"오라클 날짜 (0) | 2020.06.25 |
[SQL] 시간 반올림 두 날짜 사이의 차이를 가져 오는 방법 (0) | 2020.06.25 |