2012-02-21 3 views
0

, 내가 그것을 읽고 rs.getTimestamp()을 사용하십시오. 이제 Date 열을 사용하여 동일한 작업을 수행 할 때 Date의 적절한 String 표현을 얻습니다. 그러나 Timestamp를 사용하면 다음과 같은 String을 얻을 수 있습니다.읽기 타임 스탬프 열 .. rs.getString (인덱스)

2009-5-3 12:36:57. 618000000 

왜 공간이 밀리 초 직전에 도입되었는지 이해할 수 없습니다. 이렇게하면 미리 정의 된 타임 스탬프 형식으로 읽지 않은 타임 스탬프를 읽을 수 없게됩니다. 내가 왜 밀리 세컨드 전에 공간을 얻는가에 대한 어떤 생각?

+0

맞습니다. 타임 스탬프에 대한 JDBC 표준에는 공백이 포함되지 않습니다. 하지만'rs.getTimestamp()'를 사용하여 타임 스탬프를 읽지 않는 이유는 무엇입니까? –

+2

레거시 코드는 가장 좋은 질문을하지 않습니다. – akkyy

답변

0

문자열에 대한 암시 적 변환을 수행 중이므로 형식은 데이터베이스 세션의 NLS_TIMESTAMP_FORMAT 설정에 의해 결정됩니다. 설정은 Java 로켈에서 파생됩니다. 그것은 이상한 형식이지만, 어쩌면 어떻게 든 오버라이드 된 것입니다.

이러한 것들을 제어 할 필요가 없으며 코드를 손상시키는 환경에서 예기치 않은 변경이 발생할 수 있으므로 일반적으로 쿼리에서 형식을 지정하는 것이 안전합니다. 당신은 정말 당신이 당신의 로케일을 변경할 수

select timestamp_field from ... 

무언가 또는

select to_char(timestamp_field, 'YYYY-MM-DD HH24:MI:SS.FF3') from ... 

같은 것이 아니라, getString()으로 검색해야하는 경우; 쿼리 전에 alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF3'을 실행하여 세션의 형식을 설정하지만 모든 세션에서이 작업을 수행하거나 로그온 트리거를 사용해야 할 수 있으며 특히 연결 풀링을 사용하는 경우 다른 곳에서 예기치 않은 영향을 미칠 수 있습니다. 명시 적으로 원하는 형식으로 데이터베이스에서 데이터를 가져 오는 것이 더 분명하며 다른 누군가가 나중에 변경하면 중단되지 않습니다.

+0

NLS 형식 정보를 제공해 주셔서 감사합니다. 어떤 열이 Timestamp 데이터 형식인지 알면 쿼리 자체 내에 형식을 포함시키는 것이 좋은 옵션이었습니다. 그러나이 경우 테이블은 즉석에서 생성되며 열 데이터 유형은 다를 수 있습니다. 따라서 쿼리 내에서 형식을 사용할 수 없습니다. – akkyy

+0

@akkyy 관심이 없으면 현재 로캘이 무엇입니까? 세션이'nls_session_parameters' 뷰에서 무엇을 볼 수 있습니까? 코드에서 또는 데이터베이스의 로그온 트리거에서 형식을 설정하는 것이 이미 있으므로 값을 얻는 방법을 아는 것이 유용 할 수 있습니다. –

+0

정말 열 유형을 결정할 수 없다면'alter session'을 호출하는 것이 가장 안전 할 것입니다. (all_tab_columns의 열 유형에서 동적으로 쿼리를 작성하는 것이 궁금합니다.). 그러나 나는 다른 누군가가 이미 그것을 설정하고 당신이 충돌하여 다른 곳에서 문제를 일으킬 가능성에 대해 걱정할 것입니다. –

1

좋아, 그래서 이것은 내가 할 일이고 실현 가능한 해결책처럼 보입니다.

ResultSet rs = st.executeQuery(".."); 
ResultSetMetaData rsmt = rs.getMetaData(); 
int columnIndex = 0; 
while (rs.next()) { 
if (rsmt.getColumnType(columnIndex) == 93) { // ts field - ref. -> http://www.devdaily.com/java/edu/pj/jdbc/recipes/ResultSet-ColumnType.shtml 
    Timestamp tsTemp = this.getTimestamp(columnIndex); 
    return tsTemp.toString(); // this does give the timestamp in correct format 
} 
columnIndex ++; 
}