NLS_DATE_FORMAT 변경관련 질문입니다. 0 5 3,923

by armadillo [설치/설정] Oracle NLS_DATE_FORMAT [2023.05.13 17:34:04]


안녕하세요.

어떻게 이런경우가 생기는지 알수가 없습니다.

 

사용환경 : 

사용 Client OS : Windows 10 Pro

오라클 설치 OS : 위와 동일한 Windows 10 Pro

Oracle Version : Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Oracle Client Tool : DBeaver

 

1) 현재 NLS_DATE_FORMAT를 아래와 같이 확인

SELECT *

FROM NLS_SESSION_PARAMETERS

where parameter = 'NLS_DATE_FORMAT';

NLS_DATE_FORMAT    DD-MON-RR

 

2) spfile사용여부를 아래와 같이 확인하고

SYS>show parameter spfile;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      C:\OPT\ORACLE\PRODUCT\12.2.0\DBHOME_1\DATABASE\SPFILEORCL.ORA

 

3) sqlplus에 system 유저로 접속해서 아래와 같이 변경 

alter system set nls_date_format = 'YYYY-MM-DD' scope=spfile;

 

4) shutdown immediate, startup를 해서

다시 확인해보면와 같이 기존과 같이 동일합니다.

NLS_DATE_FORMAT    DD-MON-RR

5) 위의 spfile을 에디터로 확인해보면 아래와 같이 되어있습니다

*.nls_date_format='YYYY-MM-DD'

도대체 왜 이럴까요 ?

 

6. 그리고 NLS_DATE_FORMAT와 상관없이

select * 

from ord 

where 1=1 

and ord_dt = to_date('20120101', 'yyyymmdd')

;

여기서 ord_dt  = '20210101' 와 같이 저장되어있는데 아래와 같은 에러가 왜 생길까요 ?

SQL Error [1861] [22008]: ORA-01861: literal does not match format string

뭔가 잘못된게 있을텐데..찾을수가 없습니다.

혹 알고 계신분 조언 부탁드립니다.

감사합니다.

by pajama [2023.05.14 00:51:08]

ord_dt가 date 타입이 아니어서 오류가 나는건 아닌지요?


by 포동푸우 [2023.05.15 03:04:12]

우선, DB 서버 와 AP / Client 툴의 nls_date_format 을 일치시켜 보세요~ client 의 영향을 받습니다.

nls_date_format 과 nls_timestamp_format 을 함께 변경해 보세요 
alter 명령어 구문은 문제 없어 보이네요  

alter system set nls_date_format = 'YYYY-MM-DD' scope=spfile;
alter system set nls_timestamp_format = 'YYYY-MM-DD HH:MI:SS' scope=spfile;

둘째는,, 저도 ord_dt 컬럼이 date type 이 아니거나, 자리수가 부족해서 나는 오류 같습니다. 
 


by 마농 [2023.05.15 10:45:28]

ord_dt 는 문자 타입인 듯 하네요.
그냥 문자 그대로 비교하면 되는데 (ord_dt = '20120101')
굳이 날짜로 바꾸어 비교하면서 에러나는 것입니다.
(문자 = 날짜) 비교하면 문자가 날짜로 자동 형변환 됩니다.
이 과정에서 형식이 맞지 않으면 오류 발생.


by 마농 [2023.05.16 10:04:13]

nls_session_parameters 만 확인하셨네요?
nls_database_parameters 와 nls_instance_parameters, v$nls_parameters 도 확인해 보세요.
값이 다를 수 있습니다.


by 마농 [2023.05.16 10:19:31]

NLS_DATE_FORMAT 의 적용 우선순위는 session > instance > database 입니다. session 이 최우선
클라이언트 측에서 NLS_LANG 이 설정되면 해당 파라미터에서 언어와 지역 설정을 가져와서 암묵적으로 NLS_DATE_FORMAT을 결정합니다.
NLS_DATE_FORMAT은 NLS_LANG의 NLS_TERRITORY에서 파생됩니다.
[출처] NLS_DATE_FORMAT 설정방법 및 우선순위|작성자 uclicktech
 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입