我有一个oracle过程,它将日期作为参数,并由两个不同的Java Web应用程序调用,在我从过去的日期使用to_char(date, 'd')
提取日期的过程中。我无法找出为什么一个应用程序返回的日期与其他应用程序不同。我正在为这两个应用程序使用相同的ojdbc驱动程序。它与这些应用程序运行的机器env变量有什么关系吗?
由于
答案 0 :(得分:2)
这是因为一周的第一天在所有国家都不一样,例如在欧洲,一周的第一天是星期一,而在美国则是星期天。考虑:
SQL> select * from nls_session_parameters where parameter = 'NLS_TERRITORY';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_TERRITORY AMERICA
SQL> select to_char(date '2010-12-07', 'D') from dual;
TO_CHAR(DATE'2010-12-07','D')
-----------------------------
3
SQL> alter session set nls_territory=FRANCE;
Session altered
SQL> select to_char(date '2010-12-07', 'D') from dual;
TO_CHAR(DATE'2010-12-07','D')
-----------------------------
2
如果程序参数依赖于它,则在程序开头设置会话参数NLS_TERRITORY。
答案 1 :(得分:1)
尝试在两个应用程序中检查JAVA / Oracle中的默认语言环境。
我认为它可能取决于JAVA中设置的默认语言环境。
答案 2 :(得分:1)
尝试在启动它们时通过传递-Duser.timezone="America/New_York"
VM参数(根据您的时区需要调整)在两个webapp容器上显式指定时区。
要解决您的评论,您可以在应用程序级别中调用存储过程时明确指定所需的时区。例如:
CallableStatement statement = null;
Connection conn = null;
try {
conn = getYourConnection();
Calendar dbCal = new GregorianCalendar(YOUR_DATABASE_TIMEZONE);
String sql = "begin schema_name.package_name.stored_proc(var1=>?, " +
"var2=>?); end;";
statement = conn.prepareCall(sql);
statement.setInt(1, something);
statement.setTimestamp(2, yourDate.getTime(), dbCal);
statement.execute();
conn.commit();
} finally {
if (statement!=null) statement.close();
if (conn!=null) conn.close();
}