본문 바로가기
Oracle

[Oracle] ORA-01861 : 리터럴이 형식 문자열과 일치하지 않음

by 상후 2021. 7. 31.
728x90
반응형

 

ORA-01861 : 리터럴이 형식 문자열과 일치하지 않음 (해결방법)

ORA-01861: literal does not match format string

 

출처 : Oracle Docs

발생 원인
1. 문자열(VARCHAR2) 타입과 DATE 타입을 비교할 때
2. DATE 타입에 문자열(VARCHAR2) 타입의 데이터를 삽입할 때

 

컬럼명(Column) 데이터 타입(Data Type)
NAME VARCHAR2(10)
INSERT_DATE DATE

테이블(TEMP) 컬럼은 위와 같은 구성이라 가정합니다.

 

테스트 케이스

 

-- 1. 문자열(VARCHAR2) 타입과 DATE 타입을 비교할 때
SELECT * 
  FROM TEMP
 WHERE NAME = SYSDATE;

SELECT * 
  FROM TEMP
 WHERE INSERT_DATE > '2021-08-10';

-- 2. DATE 타입에 문자열(VARCHAR2) 타입의 데이터를 삽입할 때
INSERT 
  INTO TEMP(INSERT_DATE)
VALUES ('2021-08-10');

 

해결 방법
비교하는 대상의 타입을 일치시켜줍니다.

TO_DATE() : 날짜 형식으로 타입 변경
TO_CHAR() : 문자열 형식으로 타입 변경

 

-- 1. 문자열(VARCHAR2) 타입과 DATE 타입을 비교할 때 (해결방법)
SELECT * 
  FROM TEMP
 WHERE NAME = TO_CHAR(SYSDATE);

SELECT * 
  FROM TEMP
 WHERE INSERT_DATE > TO_DATE('2021-08-10','YYYY-MM-DD');

-- 2. DATE 타입에 문자열(VARCHAR2) 타입의 데이터를 삽입할 때 (해결방법)
INSERT 
  INTO TEMP(INSERT_DATE)
VALUES (TO_DATE('2021-08-10','YYYY-MM-DD'));

 

필자는 오라클 11g 버전을 사용하고 있는데,

VARCHAR2 타입에 DATE 타입을 삽입할 때는 정상 동작하네요!

 

-- VARCHAR2에 SYSDATE 삽입 시 정상 동작
INSERT 
  INTO TEMP(NAME) 
VALUES (SYSDATE);

INSERT 
  INTO TEMP(NAME) 
VALUES (TO_DATE('2021-08-10','YYYY-MM-DD'));

 

자주 만나볼 수도 있는 오류인데, 대부분 개발자의 실수로 발생되는 것 같다.

항상 데이터 간 타입 및 크기를 고려하고 적절한 형 변환 함수를 사용하자.

 

 

 

 

728x90
반응형

댓글