我们的java类调用PLSQL proc,它以默认格式返回日期,该格式由NLS_DATE_FORMAT定义。我们的应用程序设置了自己的国际化Locale,但我希望日期格式保持为'DD-MON-RR',即en_US Locale NLS_DATE_FORMAT。由于语言环境的变化,oracle的提取日期字符串不同,后续的TO_DATE()函数调用失败。我尝试通过更改java类中的Locale to Locale.setDefault(new Locale("en","US")); //"en_US"
来解决这个问题,但它工作正常,但国际化部分不再适用。我在新加坡,所以我的区域设置为"en_SG"
,并且设置NLS_TERRITORY: SINGAPORE
后oracle假定的日期格式为NLS_DATE_FORMAT:'DD/MM/RR'
。我向服务器查询V $ NLS_PARAMETERS,默认日期格式为'DD-MON-RR'。所以我的问题是,我可以设置NLS_DATE_FORMAT而不影响应用程序的Locale设置。或者我可以让jdbc驱动程序完全忽略客户端的NLS设置吗?
答案 0 :(得分:3)
可以使用to_char
函数来设置日期格式,也可以在to_char
函数中包含第三个参数来表示使用的语言环境:
select to_char(sysdate, 'DY-MM-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN') from dual;
有关日期格式的更多信息,请参阅SQL Reference。
答案 1 :(得分:0)
我正在为我的应用程序完成i18n的内容,我的设计基于以下假设)
1)Locale.setDefault(new Locale(“en”,“US”));因为您正在更改JVM的默认区域设置而不仅仅是针对您的应用程序,这是很糟糕的。因此,最好在每个请求的基础上传递应用程序周围的区域设置(可能是threadlocal)
2)在应用程序级别处理所有i18n格式化/解析。 DB应该只处理比较(可选),排序(可选)和存储。所以只需设置NLS_CHARACTERSET,NLS_COMP,NLS_SORT和NLS_LENGTH_SEMANTICS。顺便说一下,db级别的比较和排序意味着创建特定于语言环境的索引,从而减慢插入/更新的速度