Java:ResultSet getString()在不同环境之间有所不同

时间:2011-03-22 18:29:52

标签: java sql oracle datetime formatting

我有一个返回oracle Date对象的SQL查询。 e.g:

  

SELECT sysdate FROM DUAL

目前有代码执行以下操作:

  

String s = rs.getString(“sysdate”);

问题是,这会在不同的环境中返回不同的日期格式(数据库是相同的)。

一个环境将返回: 2011-01-31 12:59:59.0

另一个将返回更奇怪的东西: 2011-1-31 12.15.32.0(时间用小数分隔)

也许这与Locale有关...一台机器是“英语(加拿大)”,由java报道,另一台是“英语(美国)”。

我感兴趣的是,当结果集将日期对象转换为字符串时,该格式来自何处?

5 个答案:

答案 0 :(得分:7)

来自Oracle的网站:

  

在数据库连接时,JDBC   类库设置服务器   NLS_LANGUAGE和NLS_TERRITORY   与语言环境对应的参数   运行JDBC的Java VM   驱动器

所以,是的,响应的不同之处在于机器具有指定的不同语言环境。正确的解决方案应该是使用getDate()或getTimestamp(),或让数据库服务器以前面提到的特定格式将字符串作为字符串返回。

答案 1 :(得分:5)

我建议不要打电话给getString。您要求的值不是字符串,而是日期或时间戳。因此,请致电getDategetTimestamp。 (我不知道哪个是最合适的;它取决于sysdate的确切语义。)

如果你然后需要格式化它,你可以以适当的方式这样做。

从根本上说,您在代码和数据库之间引入的文本转换越少越好。这是使用参数化查询的一个原因 - 您不必关心数据库将如何解析数值或日期和时间;你只是提供价值。这是同样的事情,但相反。

答案 2 :(得分:4)

在11g驱动程序中,格式似乎是硬编码的。在结果集上调用getString()最终会调用:

oracle.sql.TIMESTAMPTZ.toString(int year, int month, int day, int hours, int minutes, int seconds, int nanos, String regionName)

对于日期,oracle.jdbc.driver.DateAccessor.getString()使用nanos = -1调用此结果,结果使用格式“yyyy-mm-dd HH:MM:SS”

对于时间戳,格式为“yyyy-mm-dd HH:MM:SS.S”。最多可包含9位纳秒。

实际上另一个有趣的结果是,这已从10g显着变为11g:

<强> 10.2.0.5.0

select a DATE value and use getString to read it

2009-04-20 00:00:00.0

select a TIMESTAMP value and use getString to read it

2010-10-15.10.16. 16. 709928000

<强> 11.2.0.2.0

select a DATE value and use getString to read it

2009-04-20 00:00:00

select a TIMESTAMP value and use getString to read it

2010-10-15 10:16:16.709928

您的环境是否可以使用不同版本的Oracle JDBC驱动程序?

答案 3 :(得分:3)

如果您真的想要它作为String,最好在查询中使用to_char。

SELECT to_char(sysdate, 'MM/DD/YYYY') FROM DUAL; 

这将是一致的。

答案 4 :(得分:1)

请勿使用getString,请使用getDate(或getTimestamp)。这样它就不会依赖数据库引擎将其转换为字符串。