1

特定の日付から曜日を計算する小さなユーティリティ関数があります。

select to_number(to_char(to_date('20130330', 'YYYYMMDD'),'D')) from dual;

このステートメントを同じデータベース インスタンスで実行すると、2 つの異なるマシンから 2 つの異なる結果が生成されます。

問題は、2 つの異なる PC で同じデータベース インスタンスを使用して同じ結果を得るためにコードを変更する方法です。

詳細

これらの nls_session パラメータを使用して PC からセッションを開始すると、結果は 6になります。

select * from nls_session_parameters;

NLS_LANGUAGE    HUNGARIAN
NLS_TERRITORY   HUNGARY
NLS_CURRENCY    Ft
NLS_ISO_CURRENCY    HUNGARY
NLS_NUMERIC_CHARACTERS  , 
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT RR-MON-DD
NLS_DATE_LANGUAGE   HUNGARIAN
NLS_SORT    HUNGARIAN
NLS_TIME_FORMAT HH24.MI.SSXFF
NLS_TIMESTAMP_FORMAT    RR-MON-DD HH24.MI.SSXFF
NLS_TIME_TZ_FORMAT  HH24.MI.SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT RR-MON-DD HH24.MI.SSXFF TZR
NLS_DUAL_CURRENCY   Ft
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE

同じデータベース インスタンスでも、次のセッション パラメータを持つ別の PC からセッションを開始すると、異なる結果が得られます: 7:

PARAMETER    VALUE
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY    AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS    .,
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT    DD-MON-RR
NLS_DATE_LANGUAGE    AMERICAN
NLS_SORT    BINARY
NLS_TIME_FORMAT    HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT    HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY    $
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP    FALSE

私の場合、正しい結果は 7 ですが、PC で提供する必要があります。私は成功せずに次のことを試しました:

  • NLS_LANGUAGE を AMERICAN に変更
  • オプションの nls_language パラメータで to_char() を使用

助言がありますか?

4

3 に答える 3

1

曜日の運用設定は ですNLS_TERRITORY

于 2013-05-10T17:03:00.100 に答える
1

@ JoachimIsakssonが言うように、発行できる場合alter sessionは、おそらくNLS_TERRITORYが最適です。しかし、それができない場合、残念ながら、オプションの引数TO_CHAR()を介してその場で変更することはサポートされていません。nlsparms

たとえば、ハンガリー語のセッションでは、最後の手段としてブルート フォースを使用できます。

alter session set nls_language = 'HUNGARIAN';

select to_char(to_date('20130330', 'YYYYMMDD'), 'DY') as hungarian,
    to_char(to_date('20130330', 'YYYYMMDD'),
        'DY', 'NLS_DATE_LANGUAGE=AMERICAN') as american
from dual;

HUN AME
--- ---
SZO SAT

select case to_char(to_date('20130330', 'YYYYMMDD'),
    'DY', 'NLS_DATE_LANGUAGE=AMERICAN')
        when 'SUN' then 1 when 'MON' then 2 when 'TUE' then 3
        when 'WED' then 4 when 'THU' then 5 when 'FRI' then 6
        when 'SAT' then 7
    end as american
from dual;

  AMERICAN
----------
         7

...これは醜いですが、セッションを変更することによる副作用を回避します。もちろん、これが複数の場所で問題になる場合は、関数に変えることができます。

于 2013-05-10T17:31:23.823 に答える