2012-02-21 83 views
0

雖然從使用Java 6的Oracle 10g讀書timestamp列數據,我讀它,如下所示:閱讀時間戳列.. rs.getString(指數)

String str = rs.getString(index); 

我不想使用rs.getTimestamp()。現在,當我對Date列做同樣的處理時,我得到一個適當的Date表示。但隨着時間戳,我得到一個字符串,如下所示:

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

我不明白爲什麼一個空間就在毫秒前出臺。這使得我通過預定義的時間戳格式讀取的時間戳不可解析。任何想法,爲什麼我會在毫秒之前獲得空間?

+0

你說得對,時間戳的JDBC標準不包括空格。但爲什麼不使用'rs.getTimestamp()'讀取時間戳呢? – 2012-02-21 15:58:28

+2

傳統代碼最好不要質疑:) – akkyy 2012-02-21 17:31:29

回答

0

你正在做一個隱式轉換爲字符串,這樣的格式是由你的數據庫會話的NLS_TIMESTAMP_FORMAT設置,這是從你的Java語言環境派生確定。儘管這是一種奇怪的格式,所以也許它會以某種方式被覆蓋。

正如你往往沒有過這樣的事情的控制,你可能會在打破你的代碼的環境意外改變,這是一般比較安全的指定查詢的格式。如果你真的需要用getString()檢索它,而不是

select timestamp_field from ... 

這樣做

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

或者你可以改變你的語言環境;或通過在查詢之前執行alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF3'來設置會話中的格式,但是您必須在每個會話中執行此操作(或使用登錄觸發器),並且可能會在其他位置產生意外影響,特別是在使用連接池時。以所需格式顯式地從數據庫中獲取數據更加明顯,並且如果其他人稍後改變某些內容,則不會中斷數據。

+0

感謝NLS格式的信息。如果我知道哪一列是Timestamp數據類型,那麼在查詢本身中包含一個格式是一個很好的選擇。但是,在這種情況下,表格即時生成,列數據類型可能會有所不同。所以,不能使用查詢中的格式。 – akkyy 2012-02-21 18:12:40

+0

@akkyy出於興趣,您當前的語言環境是什麼;你是否能夠在'nls_session_parameters'視圖中看到你的會話有什麼?知道它是如何獲得該值可能是有用的,因爲可能已經有設置格式的內容,可以在代碼中或數據庫中的登錄觸發器中進行設置。 – 2012-02-21 18:30:45

+0

如果你真的不能確定列類型(我猜從all_tab_columns中的列類型動態構建查詢是不可能的?),調用'alter session'對你來說可能是最安全的。但是我擔心別人已經設置好了,你可能會衝突,導致其他地方出現問題。 – 2012-02-21 18:32:10

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 ++; 
}