Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有JDBC的NLS_日期_格式_Java_Oracle_Date_Jdbc - Fatal编程技术网

Java 带有JDBC的NLS_日期_格式

Java 带有JDBC的NLS_日期_格式,java,oracle,date,jdbc,Java,Oracle,Date,Jdbc,我试图在jdbc中设置NLS_DATE_格式,但似乎没有任何效果。 我的代码: //... Connection conn = ods.getConnection(); Statement stat = conn.createStatement(); stat.execute("alter session set NLS_DATE_FORMAT='YYYY-DD-MM'"); ResultSet rs = stat.executeQuery("select dat

我试图在jdbc中设置NLS_DATE_格式,但似乎没有任何效果。 我的代码:

//...
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_格式在JDBC驱动程序中是硬编码的。这是正确的吗?由此得出的结论:

语言和领土

精简驱动程序从JVM user.language属性中的Java语言环境获取语言和区域设置(NLS_语言和NLS_区域)。日期格式(NLS\U date\U格式)根据区域设置进行设置

所以我试了一下:

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')
我明白了


使用Oracle11g、OracleJDBCdrive12.1和Java8,可以从jdbc驱动程序获得NLS支持。无论如何,我建议您不要依靠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));
请注意,SimpleDataFormat的实例是可重用的,但不是线程安全的

如果您使用的是Java8,那么您可能希望使用新的和改进的Java时间API。不幸的是,ResultSet尚未更新以返回DateTime实例,因此您必须转换。查看并了解如何从旧版本转换为新版本。DateTimeFormatter的其他优点之一是完全线程安全的


新旧样式的格式模式相同;对于新的。

ResultSet.getString()
DATE
列上永远不会使用DBMS特定的“NLS设置”。它仅对从数据库获得的日期值调用
java.sql.Timestamp.toString()
。但依赖任何隐式数据类型转换一开始都不是一个好主意。可以使用
getTimestamp()
SimpleDataFormat
在Java代码中应用所需的格式,也可以在SELECT语句中使用
to_char()
让Oracle对其进行格式化。@a_horse_与\u no_name一起我想相信调用了toString()。但是当检查文档中的数据时。toString:将日期格式化为日期转义格式yyyy-mm-dd。这不是我得到的格式吗?你怎么认为?感谢
java.sql.Date.toString()
返回该格式-它是内置的。您可以自己尝试
System.out.pringln(新java.sql.Date(0.toString())
java.sql.Timestamp
FWIW也是如此,我唯一能找到引用文档的地方就是Oracle8i的文档。您需要在文档搜索中包含“11g”。)兼容的JDBC4.2驱动程序需要通过和相关的方法支持
java.time
API。因此,
ResultSet.getObject(1,LocalDate.class)
需要工作。决定不再使用
getLocalDate
etc方法进一步扩展API。@JakeRobb我知道所有这些。但是我不允许使用getDate()。我需要以字符串形式检索所有数据。我做了一些新的测试。事实上:stat.executeQuery(“插入到tesy_表值(“10-OCT-15”)工作正常。这意味着JDBC依赖于JVM NLS_DATE_格式。但我不知道为什么它对SELECT不起作用。@iman:“我需要以字符串形式检索所有数据。”“-无意冒犯,但这很愚蠢。我很想知道为什么你需要将所有数据作为字符串检索。这是什么,学校作业?也就是说,你可以使用不同的SimpleDataFormat(使用与10-OCT-15格式匹配的模式)将字符串解析为日期,然后使用另一个SDF将其格式化为你想要的格式。
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));