C#에서 쿼리 실행시 ORA-01861 나네요 좀 봐주세요 0 2 1,498

by 프리빵 [SQL Query] ORA-01861 [2017.02.27 13:16:44]


오라클 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')                  
 

by 마농 [2017.02.27 13:40:24]

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')
;

 


by 프리빵 [2017.02.27 14:55:24]

좋은설명 감사합니다^^

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