Wil*_*ill 3 java sql oracle formatting datetime
我有一个返回oracle Date对象的SQL查询.例如:
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报道,另一台是"英语(美国)".
我感兴趣的是,当结果集将日期对象转换为字符串时,该格式来自何处?
小智 7
来自Oracle的网站:
在数据库连接时,JDBC类库将服务器NLS_LANGUAGE和NLS_TERRITORY参数设置为与运行JDBC驱动程序的Java VM的区域设置相对应
所以,是的,响应的不同之处在于机器具有指定的不同区域设置.正确的解决方案应该是使用getDate()或getTimestamp()或让数据库服务器以前面提到的特定格式将字符串作为字符串返回.
我建议不要打电话getString.您要求的值不是字符串,而是日期或时间戳.所以打电话getDate或getTimestamp代替.(我不知道哪个是最合适的;它取决于确切的语义sysdate.)
如果再需要格式化它,你可以以适当的方式这样做.
从根本上说,您在代码和数据库之间引入的文本转换越少越好.这是使用参数化查询的一个原因 - 您不必关心数据库将如何解析数值或日期和时间; 你只是提供价值.这是同样的事情,但相反.
在 11g 驱动程序中,格式似乎是硬编码的。调用getString()结果集最终会调用此:
oracle.sql.TIMESTAMPTZ.toString(int year, int month, int day, int hours, int minutes, int seconds, int nanos, String regionName)
Run Code Online (Sandbox Code Playgroud)
对于日期,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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
您的环境是否可以使用不同版本的 Oracle JDBC 驱动程序?