パラメータとして日付を取り、2 つの異なる Java Web アプリケーションによって呼び出される Oracle プロシージャがあります。プロシージャ内で、to_char(date, 'd')
渡された日付から使用して日を抽出します。あるアプリによって返される日が他のアプリと異なる理由を見つけることができません。両方のアプリに同じ ojdbc ドライバーを使用しています。これらのアプリが実行されているマシンの環境変数と関係がありますか?
ありがとう
これは、週の最初の曜日がすべての国で同じではないためです。たとえば、ヨーロッパでは週の最初の曜日は月曜日ですが、米国では日曜日です。検討:
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 に依存する場合は、プロシージャの最初に設定します。
-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();
}
両方のアプリケーションで、JAVA/Oracle のデフォルト ロケールを確認してみてください。
JAVAに設定されているデフォルトのロケールに依存する可能性があると思います。