2010-12-07 4 views
2

У меня есть процедура оракула, которая принимает дату в качестве параметра и вызывается двумя различными веб-приложениями Java, в рамках процедуры я извлекаю день с использованием to_char(date, 'd') с даты, прошедшей с даты. Я не могу узнать, почему день, возвращенный одним приложением, отличается от другого. Я использую тот же драйвер ojdbc для обоих приложений. Имеет ли это какое-либо отношение к переменной env машины, на которой работают эти приложения?Процедура вызова JDBC Java

Благодаря

+4

Я думаю, вы имели в виду `to_char (date, 'd')` вместо `sysdate (date, 'd')`. – 2010-12-07 10:18:31

+0

Не могли бы вы разместить соответствующие части процедуры? – 2010-12-07 10:19:08

+0

Спасибо, Адам, ты прав. В основном я буквально делаю to_char (дата, 'd'), и все. – Abidi 2010-12-07 10:28:33

ответ

1

Попробуйте указать часовой пояс на обоих ваших контейнерах webapp, передав им аргумент VM -Duser.timezone="America/New_York" (настроить для каждого вашего часового пояса) при запуске их.

Чтобы ответить на ваш комментарий, на уровне приложения вы можете явно указать желаемый часовой пояс при вызове хранимой процедуры. Например:

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(); 
    } 
1

попытаться проверить локаль по умолчанию в Java/Oracle в обоих приложениях.

Я думаю, что это может зависеть от языкового стандарта по умолчанию, установленного в JAVA.

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 в начале процедуры, если это зависит от него.

Смежные вопросы