2

パラメータとして日付を取り、2 つの異なる Java Web アプリケーションによって呼び出される Oracle プロシージャがあります。プロシージャ内で、to_char(date, 'd')渡された日付から使用して日を抽出します。あるアプリによって返される日が他のアプリと異なる理由を見つけることができません。両方のアプリに同じ ojdbc ドライバーを使用しています。これらのアプリが実行されているマシンの環境変数と関係がありますか?

ありがとう

4

3 に答える 3

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 に依存する場合は、プロシージャの最初に設定します。

于 2010-12-07T13:46:40.707 に答える
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();
    }
于 2010-12-07T12:27:01.113 に答える
1

両方のアプリケーションで、JAVA/Oracle のデフォルト ロケールを確認してみてください。

JAVAに設定されているデフォルトのロケールに依存する可能性があると思います。

于 2010-12-07T10:22:11.313 に答える