使用JDBC的NLS_DATE_FORMAT

时间:2016-04-15 14:01:37

标签: java oracle date jdbc

我试图在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

1 个答案:

答案 0 :(得分:3)

JDBC驱动程序的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。{/ p>