2016-04-15 59 views
2

我試圖在jdbc裏設置NLS_DATE_FORMAT,它似乎沒有任何效果。 我的代碼:帶JDBC的NLS_DATE_FORMAT

//... 
Connection conn = ods.getConnection(); 
Statement stat = conn.createStatement(); 

stat.execute("alter session set NLS_DATE_FORMAT='YYYY-DD-MM'"); 
ResultSet rs = stat.executeQuery("select date_column from test_table"); 

System.out.println(rs.getString(1)); // *** new format not effective here *** 
//... 

經過一番閱讀。我瞭解NLS_DATE_FORMAT在JDBC驅動程序中是硬編碼的。它是否正確 ?總之,從本作:

語言和地域

Thin驅動程序從JVM user.language屬性的Java語言環境獲得語言和地區設置(NLS_LANGUAGE和NLS_TERRITORY)。日期格式(NLS_DATE_FORMAT)根據地區設置進行設置。

所以,我想這一點:

Locale.setDefault(new Locale("en", "US")); 
Connection conn = ods.getConnection(); 
Statement stat = conn.createStatement(); 

ResultSet rs = stat.executeQuery("select date_column from test_table"); 

System.out.println(rs.getString(1)); // *** JVM format not effective here 

但它不工作。相反,越來越像

10-OCT-15 (NLS_DATE_FORMAT for US = 'DD-MON-RR') 

我得到

2015-10-10 00:00:00.0 

從JDBC驅動程序使用Oracle 11g,甲骨文JDBC驅動12.1,JAVA 8

+5

「DATE」列上的'ResultSet.getString()'永遠不會遵循DBMS特定的「NLS設置」。它只是從數據庫獲得的日期值上調用'java.sql.Timestamp.toString()'。但是依賴任何隱式數據類型轉換是一個不好的主意。使用'getTimestamp()'並使用'SimpleDateFormat'在您的Java代碼中應用您想要的格式,或者在SELECT語句中使用'to_char()'讓Oracle對其進行格式化。 –

+0

@a_horse_with_no_name我想相信toString()被調用。但是在檢查Data.toString的文檔時:以日期轉義格式yyyy-mm-dd格式化日期。這不是我得到的格式嗎?你怎麼看 ?謝謝 – iman

+0

'java.sql.Date.toString()'返回格式 - 它是內置的。你可以自己嘗試'System.out.pringln(new java.sql.Date(0).toString())'。 java.sql.Timestamp' –

回答

3

NLS支持是dropped in Oracle 10g。無論如何,我建議您不要依賴Oracle特定的NLS功能來格式化日期。

要格式化從Java中的所有數據庫中檢索日期,這樣做:

Connection conn = ods.getConnection(); 
Statement stat = conn.createStatement(); 

ResultSet rs = stat.executeQuery("select date_column from test_table"); 

DateFormat format = new SimpleDateFormat('yyyy-dd-MM'); 
System.out.println(format.format(rs.getDate(1)); 

注意SimpleDateFormat的實例是可重複使用的,但不是線程安全

如果您使用的是Java 8,則可能需要改用新的改進的Java Time API。不幸的是,ResultSet尚未更新以返回DateTime實例,因此您必須進行轉換。查看DateTimeFormatterthis question關於如何將舊的轉換爲新的。除其他優點外,DateTimeFormatter完全是線程安全的。

舊樣式和新樣式的格式模式相同; here are the docs爲新的。

+1

兼容的JDBC 4.2驅動程序需要通過['getObject(int,Class )'](http://docs.oracle.com)支持'java.time' API。com/javase/8/docs/api/java/sql/ResultSet.html#getObject-int-java.lang.Class-)和相關方法。因此''ResultSet.getObject(1,LocalDate.class)'需要工作。我們決定不用'getLocalDate'等方法進一步擴展API。 –

+0

@JakeRobb我知道所有這一切。但我不允許使用getDate()。我需要將所有數據作爲字符串進行檢索。我進行了一些新的測試。實際上:stat.executeQuery(「INSERT INTO tesy_table values(」10-OCT-15「)正常工作。這意味着JDBC依賴於JVM NLS_DATE_FORMAT。但我不知道爲什麼它不適用於SELECT。 – iman

+1

@iman :「*我需要檢索所有數據作爲字符串*」 - 沒有冒犯,但那是愚蠢的。 –