2013-05-10 4 views
1

나는 주어진 날짜에서 요일을 계산하는 작은 유틸리티 기능이 있습니다동일한 DB 인스턴스에서 다른 세션의 to_char()와 동일한 결과를 생성하는 방법은 무엇입니까?

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

이 동일한 데이터베이스 인스턴스에이 문을 실행하지만, 두 개의 서로 다른 기계에서 두 개의 서로 다른 결과를!

질문 : : 두 개의 다른 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 

동일한 데이터베이스 인스턴스는 다른 결과를 제공합니다 : 7을 세션을 시작하여 이 세션 매개 변수를 가진 다른 PC에서 :

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에서 제공해야합니다. 내가 해봤 성공하지 않고 다음

  • 미국
  • 사용 TO_CHAR에 NLS_LANGUAGE를 변경() 옵션 NLS_LANGUAGE 매개 변수

어떤 제안으로?

미리 감사드립니다.

답변

1

alter session을 발행 할 수 있다면 @JoachimIsaksson이 말한 것처럼 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 

... 어떤 부작용이 세션을 변경하지 않도록합니다. 물론 이것이 여러 곳에서 문제가 될 수 있다면 기능으로 전환 할 수 있습니다.