【发布时间】:2016-08-07 13:15:21
【问题描述】:
我尝试在 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
使用ORACLE 11g,Oracle jdbc驱动12.1,java 8
【问题讨论】:
-
ResultSet.getString()在DATE列上永远不会遵守 DBMS 特定的“NLS 设置”。它只是在从数据库中获取的日期值上调用java.sql.Timestamp.toString()。但是一开始就依赖任何隐式数据类型转换是一个坏主意。使用getTimestamp()和SimpleDateFormat在Java 代码中应用您想要的格式,或者在SELECT 语句中使用to_char()让Oracle 对其进行格式化。 -
@a_horse_with_no_name 我想相信 toString() 被调用了。但是在检查 Data.toString 的文档时:以日期转义格式 yyyy-mm-dd 格式化日期。这不是我得到的格式吗?你怎么看 ?谢谢
-
java.sql.Date.toString()返回该格式 - 它是内置的。您可以自己尝试System.out.pringln(new java.sql.Date(0).toString())。java.sql.Timestamp也是如此 -
FWIW,我唯一能找到引用文档的地方是 Oracle 8i 的文档。您需要在文档搜索中包含“11g”。 :)