오라클 10g 입니다 툴상에서(pl-sql)에선 아래 문장이 실행이되는데
C# 소스상에서는 ORA-01861 에러가 발생하네요 도통감을 못잡겠는데 이런적 있으신분 있나요?
ADD_MONTHS 쿼리함수를 쓰는데 오라클10g관련 DLL를 사용하고있습니다
WHERE TO_CHAR(SUBSTR(T1.xxx_DATE,1,4)) = TO_CHAR(ADD_MONTHS(TO_DATE(a_Fun('D'),'YYYYMMDD'), -9),'YYYY')
AND TO_CHAR(TO_DATE(T1.xxx_DATE),'Q') = TO_CHAR(ADD_MONTHS(TO_DATE(a_Fun('D'),'YYYYMMDD'), -9),'Q')
1. 오류의 원인은
- 형변환 시 포멧을 지정하지 않아서입니다.
- 수행 환경에 따라 에러가 발생되기도 하고, 정상 수행되기도 합니다.
- 변경전 : TO_DATE(T1.xxx_DATE)
- 변경후 : TO_DATE(T1.xxx_DATE, 'yyyymmdd')
2. 컬럼을 변형시켜 비교하는 것은 비효율입니다.
- 컬럼은 그대로 둔채 조건을 변형하여 비교하세요.
3. 함수 사용은
- 함수 사용시 데이터 건수 만큼 함수가 반복 수행됩니다.
- 스칼라서브쿼리의 캐시 기능을 이용하여 1번만 수행되도록 개선하세요.
아래 쿼리는 t1.xxx_date 가 yyyymmdd 형식의 8자리 문자열이라고 가정하고 작성한 것입니다.
SELECT * FROM t1 WHERE t1.xxx_date >= TO_CHAR(TRUNC(ADD_MONTHS(TO_DATE((SELECT a_Fun('D') FROM dual), 'yyyymmdd'), -9), 'Q') , 'yyyymmdd') AND t1.xxx_date <= TO_CHAR(TRUNC(ADD_MONTHS(TO_DATE((SELECT a_Fun('D') FROM dual), 'yyyymmdd'), -6), 'Q')-1, 'yyyymmdd') ;