java环境是否更改了NLS_DATE_FORMAT参数的值?

时间:2011-09-10 07:41:11

标签: java oracle jdbc database-connection

我有一个unix和一个linux服务器分别用作数据库服务器和应用服务器。 数据库是Oracle 10g,App Server是安装了jRockit 1.5的Weblogic 9.3 MP3。 我在weblogic服务器中创建了一个连接池。

我尝试用四种不同的方式从NLS_DATABASE_PARAMETERS,NLS_SESSION_PARAMETERS和NLS_INSTANCE_PARAMETERS表中读取NLS_DATE_FORMAT。

  1. 使用sqlplus显示所有人的DD-MON-YYYY,如预期的那样。
  2. 我的网络应用程序中的池连接NLS_SESSION_PARAMETERS表将其显示为DD-MON-RR,其余表显示DD-MON-YYYY。
  3. 直接获取数据库连接的独立java程序,与(3)
  4. 中的结果相同
  5. 从我的电脑中跑出相同的节目,它显示出与(1)中相同的结果,即所有人都是.DD-MON-YYYY。
  6. 我没有在我的环境中的任何地方(在数据库服务器上,在应用服务器上或在PC上)设置NLS_LANG或NLS_DATE_FORMAT。 init.ora具有DD-MON-YYYY设置。

    因此,在服务器上执行java代码时,NLS_DATE_FORMAT会有什么不同。

3 个答案:

答案 0 :(得分:4)

很难说没有看到任何代码就会发生什么,但你根本不应该依赖数据库日期格式。您应该将日期/时间戳值作为对象获取 - 然后您可以根据需要对它们进行格式化。从根本上说,你没有存储字符串 - 你要存储日期或时间戳。我自然可以写成“19/06/1976”的日期可能由其他人写成“06-19-1976” - 但两者都代表同一日期。

这就像询问数据库是使用十六进制还是十进制来存储整数:它们也没有这样做,只要我们应该关心:它自己存储整数。将数字视为数字,将日期视为日期,将时间戳视为时间戳等,并且当您想要向用户显示某些内容时,请为该用户选择最合适的格式。

答案 1 :(得分:1)

据我所知,JDBC驱动程序会将NLS设置调整为Java的系统属性user.locale设置为的任何值。

因此,应用程序服务器的区域设置和您的lokal PC之间可能存在很大差异。

答案 2 :(得分:0)

  

“NLS_SESSION_PARAMETERS表将其显示为DD-MON-RR”

这种格式是,或者至少应该被弃用。它是在九十年代后期引入的,作为Y2K问题的重要组成部分。它的目的是将一个世纪追加到仅作为YY输入的日期。它使用窗口算法来确定YY是否需要一个19或20世纪。枢轴是固定的 - 49 - 因此日历滚动分配变得越来越不令人满意。

事实上,你得到的是0011而不是2011年的日期建议你有持续的Y2K问题。空间不再是问题,没有明确指定完整YYYY格式的借口。

相关问题