2014-12-05 3 views
1

주어진 쿼리를 실행할 때 오류가 발생합니다. 동일한 쿼리는 count (*)를 *로 바꿀 때 결과를 반환하지만 여전히 결과 집합을 스크롤하면 같은 오류가 다시 발생합니다. 이 문제를 해결하는 데 도움주세요.ORA-01861 : count (*) 사용시 리터럴 형식 문자열과 일치하지 않습니다.

SELECT count(*) 
FROM cd_table 
WHERE 
    SW_CODE = 'PSTN' AND 
    CRP_CODE = 'WLR' AND 
    ERR_CODE = nvl('', ERR_CODE) AND 
    PRS_ID = 'E' AND 
    STATUS in ('0', '1') and 
    TO_DATE(TRANS_ST_DATE,'DD/MM/YY') > sysdate-90 ; 

TRANS_ST_DATE의 값은 varchar이고 데이터는 23/09/14와 같습니다.

ORA-01861 : 형식 문자열과 일치하지 않는 문자 01861. 00000 - "형식 문자열과 일치하지 않는 문자" * 원인 : 입력의 리터럴이와 형식 문자열 리터럴과 같은 길이 (수 있어야합니다 선행 공백 제외). "FX"한정자를 토글 한 경우 리터럴은 정확히 일치해야합니다 (추가 공백없이 ). * 지침 : 리터럴과 일치하도록 형식 문자열을 수정하십시오.

+0

변화

도움이되기를 바랍니다 논리적으로 정확하지 않은 NVL 절을 수정 ERR_CODE = NVL을 ('', ERR_CODE) AND to : ERR_CODE IS NULL 및 –

+1

잘 작동합니다. http://sqlfiddle.com/#!4/d41d8/38317 당신은'TRANS_ST_DATE'에서 당신이 생각하는 것을하지 않을 가능성이 있습니다 – zerkms

답변

1

먼저 데이터를 문자열로 저장하지 않도록하십시오. SQL에는 날짜/시간에 대한 기본 유형이 있습니다. 그것을 써.

분명히 열 형식이 예상 한 것이 아닙니다. 당신이 시도 할 수 있습니다 :

(CASE WHEN SUBSTR(TRANS_ST_DATE, 1, 2) BETWEEN '01' and '31' and 
      SUBSTR(TRANS_ST_DATE, 4, 2) BETWEEN '01' and '12' AND 
      TRANS_ST_DATE LIKE '__/__/__' 
     THEN TO_DATE(TRANS_ST_DATE,'DD/MM/YY') 
END) > sysdate - 90 

당신이 좋아하는 뭔가 잘못된 값을 찾을 수 있습니다 당신은 아마 SQL Developer 또는 PL/SQL 개발자와 같은 프론트 엔드 클라이언트를 사용하는

select TRANS_ST_DATE 
from cd_table 
where (NOT SUBSTR(TRANS_ST_DATE, 1, 2) BETWEEN '01' and '31') OR 
     (NOT SUBSTR(TRANS_ST_DATE, 4, 2) BETWEEN '01' and '12') OR 
     (TRANS_ST_DATE NOT LIKE '__/__/__') 
+0

고마워요 ... 그것은 내가 문제의 가치를 발견하고 그것들을 바로 잡는 것을 도왔습니다. 이 테이블은 제 3 자의 테이블입니다. 나는 didnot/do not가 같은 실수를하지 않을 것을 맹세한다. ha ha ha. 다시 한 번 감사드립니다! –

0

, 이러한 클라이언트는 반환을 수행 할 때 몇 줄의 행이 처음 50 또는 500 행이라고 말합니다. 따라서 귀하의 질의는 결과를 반환하는 중입니다 select * from table

당신이 직면하고있는 문제와 관련하여, ate를 원하는 형식으로 변환 할 수없는 경우가 일반적입니다. 따라서 TRANS_ST_DATE 열에 무엇이 있는지 확인해야합니다.

@jim의 맥나마라는 당신이 그것을 사용하는 방법으로 자신의 의견에 제시된 것처럼 마지막으로

그것이 Vishad

+0

고마워....... 자사의 SQL 개발자. 백만 행의 값이 '18/08/11 '인 25 행의'20110818 '유형이 있습니다. –

관련 문제