이 글에서는 DATE 형식에서 월에 대한 날짜 범위를 벗어났을 때 오류에 대해서 알아 보겠습니다. 각 월 마다 날짜의 범위는 다릅니다. 10월은 1일에서 31일까지 있지만 11월은 1일에서 30일까지 만 존재합니다.
조사 환경
이 글은 “Windows10 Pro에서 무상으로 이용가능한 Oracle Database Express Edition 18c 설치하기” 글에서 작성한 XEPDB1 플러그인 데이터베이스(PDB) 환경에서 조사했습니다.
scott/tiger접속을 위해서는 “연습 데이터용 샘플 스키마 “SCOTT” 작성하기” 글을 참조하십시오.
그외 이하 환경에서도 연습할 수 있습니다.
Windows Server 2012 R2에서 Oracle Database 12.2.0.1.0 for Microsoft Windows x64 설치 하기
Windows Server 2019 에서 Oracle Database 19c for Microsoft Windows x64 설치 하기
오류 샘플
다음과 같이 2021/11/31은 존재하지 않는 날짜이기 때문에 오류가 발생합니다.
한글 오류 메시지
C:\>set nls_lang=KOREAN_KOREA.KO16MSWIN949
C:\>sqlplus scott/tiger@localhost:1521/XEPDB1
SQL*Plus: Release 18.0.0.0.0 - Production on 일 11월 14 11:32:28 2021
Version 18.4.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
마지막 성공한 로그인 시간: 일 11월 14 2021 11:31:39 +09:00
다음에 접속됨:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
SQL> select to_date('2021/11/31','YYYY/MM/DD') from dual;
select to_date('2021/11/31','YYYY/MM/DD') from dual
*
1행에 오류:
ORA-01839: 지정된 월에 대한 날짜가 부적합합니다
영문 오류 메시지
C:\>set nls_lang=American_America.AL32UTF8
C:\>sqlplus scott/tiger@localhost:1521/XEPDB1
SQL> select to_date('2021/11/31','YYYY/MM/DD') from dual;
select to_date('2021/11/31','YYYY/MM/DD') from dual
*
ERROR at line 1:
ORA-01839: date not valid for month specified
정상 샘플
정상으로 출력되었습니다 만 Date 출력 형식이 YYYY/MM/DD 이 아닌 DD-MON-RR 로 출력되었습니다.
C:\>sqlplus scott/tiger@localhost:1521/XEPDB1
SQL> select to_date('2021/11/30','YYYY/MM/DD') from dual;
TO_DATE('2021/11/3
------------------
30-NOV-21
nls_date_format 의 현재 설정상태는 다음 SQL문으로 확인할 수 있습니다.
SQL> COLUMN parameter FORMAT A20;
COLUMN value FORMAT A30;
select parameter , value from v$nls_parameters
where parameter = 'NLS_DATE_FORMAT';
PARAMETER VALUE
-------------------- ------------------------------
NLS_DATE_FORMAT DD-MON-RR
다음과 같이 nls_date_format을 YYYY/MM/DD으로 변경함으로써 원하는 형식의 결과를 출력할 수 있게 되었습니다.
SQL> alter session set nls_date_format = 'YYYY/MM/DD';
SQL> select to_date('2021/11/30','YYYY/MM/DD') from dual;
TO_DATE('2
----------
2021/11/30