select * from table
where to_char(NVL(DT,TO_DATE(SYSDATE,'YYYYMMDD')),'YYYYMMDD') <= SYSDATE
위에 구분은 로컬환경과 TOAD에서는 잘돌아 갑니다
하지만 운영환경에서 포멧오류 가 나는데요 <= TO_CHAR(SYSDATE,'YYYYMMDD')로 하면 잘돌아가구요
위 첫번째 쿼리는 개발DB+로컬환경 /개발DB 토드/운영DB 토드 / 운영DB +로컬 에서 잘돌아가나
반영후 운영에서 돌리면 오류가 납니다 어떤이유에서 오류가 나는걸까요
잘모르겠네요 ㅠ 아 디비는 ORACLE입니다
-----------------------------------------
select * from table
where to_char(NVL(DT,TO_DATE('19000101','YYYYMMDD')),'YYYYMMDD') <= SYSDATE
급하게 적느라 잘못적었네요 죄송합니다 ...ㅠ
-------------------------------------\
ora 01861 에러 코드입니다.
운영에서 돌릴 때 dt가 null인 데이터가 있나보네요.
운영DB 토드에서는 오류가 안나셨다면 다른 where 조건에 의해서 dt가
null인 데이터가 제거된 것이 아닐까 싶네요.
다른 조건 다 지우시고 해당 조건만 남긴채 돌리시면 토드에서도 오류날 겁니다.
오류 내용을 적어주시면 더 정확할 것 같은데 아마도 ORA-01858일 것 같네요.
dt가 date형 컬럼이라면 nvl(dt,sysdate) <= sysdate 그냥 이렇게 해주시는 게 나을 것 같네요.
혹시나 dt가 index 컬럼에 해당한다면 (dt <= sysdate or dt is null) 이게 더 맞을 것 같구요.
(null조건 때문에 좀 애매하네요. 어차피 null 조건 때문에 full table access 할 것 같은데.. ㅋ
변경하시고 실행계획 보세용~)
다시 올려주신 쿼리를 보니
to_char(NVL(DT,TO_DATE('19000101','YYYYMMDD')),'YYYYMMDD') <= SYSDATE
제일 바깥 to_char를 붙이신 이유는 truncate 때문인가요?
그렇다면 마농님 답변의 WHERE NVL(TRUNC(dt, 'dd'), sysdate) <= sysdate를 쓰셔야할 것 같구요.
위에 쿼리상으로는 to_char가 쓸데없이 씌워졌지만 서버 날짜형이 yyyy-mm-dd 인 게 맞다면 자동
변환되면서 문제가 생기지 않는 쿼리예요. 그래서 토드에서는 오류가 안 났겠죠.
말씀하신 것처럼 jdbc 버전에 따라서 쿼리 자동변환시 좌측 우측을 다른 형식으로 인지했다면
오류가 날수도 있겠네요. 로컬환경과 실제 운영 jdbc 환경 비교해보세요.
똑같은 운영 DB에서, 똑같은 조회 조건으로 로컬에서는 오류가 안 나고 실제 운영 환경에서는
오류가 났다고 하셔서 jdbc쪽 문제일 수도 있겠다 생각하고 검색해보니
http://blog.naver.com/cchhooo21/110189135884
이런 글들도 있네요. 여튼 jdbc 환경도 비교해보시구요.
결론적으로는 형비교시에 양쪽 포맷이 달라서 나는 오류입니다.
마농님 말씀대로 평소에 명시적 형변환이 가능하게 쿼리 만드시구요^^;
NLS_DATE_FORMAT 에 영향을 받습니다.
Database 나 Instance 레벨에서 정의된 포멧도 있지만
결국은 Session 레벨에서 정의된 포멧을 따르게 됩니다.
각 유저별로 접속할 때 다르게 설정하면서 접속하기도 하며
각 사용툴(오렌지/토드/디벨로퍼 등) 별로도 다르게 설정하기도 합니다.
웹서버에서 다르게 설정할 수도 있겠지요.
이 설정값을 변경하여 오류를 잡는 것은 잠재적인 위험을 않고 가는 거죠.
서버를 변경하거나, 웹서버를 바꾸거나, 사용 툴을 바꾸거나... 등등
이런 외적인 환경요소에 영향을 받지 않도록 쿼리를 작성하는게 맞습니다.