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
뭔가 잘못된게 있을텐데..찾을수가 없습니다.
혹 알고 계신분 조언 부탁드립니다.
감사합니다.
우선, 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 이 아니거나, 자리수가 부족해서 나는 오류 같습니다.
NLS_DATE_FORMAT 의 적용 우선순위는 session > instance > database 입니다. session 이 최우선
클라이언트 측에서 NLS_LANG 이 설정되면 해당 파라미터에서 언어와 지역 설정을 가져와서 암묵적으로 NLS_DATE_FORMAT을 결정합니다.
NLS_DATE_FORMAT은 NLS_LANG의 NLS_TERRITORY에서 파생됩니다.
[출처] NLS_DATE_FORMAT 설정방법 및 우선순위|작성자 uclicktech