정말 모르겠습니다..... 0 21 3,019

by 개논물 [2015.07.15 16:28:30]


도저히 모르겠습니다. 도와주세요..

오라클 버전은 10.2 입니다.

SELECT TO_DATE(reqdt, 'YYYY-MM-DD HH24:MI:SS') AS reqdt, 
 TO_DATE(RESERVEDT, 'YYYY-MM-DD HH24:MI:SS') AS RESERVEDT, 
 TO_DATE(SENTDT, 'YYYY-MM-DD HH24:MI:SS') AS SENTDT
 FROM test
 WHERE 1=1 
 AND userid = 'test'

이쿼리를 실행 시키면 정상적인 결과가 나옵니다.  하지만

 

SELECT TO_DATE(reqdt, 'YYYY-MM-DD HH24:MI:SS') AS reqdt, 
 TO_DATE(RESERVEDT, 'YYYY-MM-DD HH24:MI:SS') AS RESERVEDT, 
 TO_DATE(SENTDT, 'YYYY-MM-DD HH24:MI:SS') AS SENTDT
 FROM MSGSUMMARY 
 WHERE 1=1 
 AND userid = 'test'
 ORDER BY CODE  

order by 만 붙이면 

ORA-01861: literal does not match format string 이런 에러가 떠버리네요.... 

code 는 number 타입이며 null 값이 있는것도 아님니다. ..

정말 답답하네요..  혹시 저같은 현황 경험 해보신분이라면 제발 답변좀 부탁드립니다. 감사합니다.

 

 

 

by DarkBee [2015.07.15 16:36:55]
첫번째 SQL도 마찬가지로 전체 Data 를 읽어오면 오류가 

나지 않을까 생각이 듭니다.

reqdt / reservedt / sentdt 컬럼에 null 또는 시간에 부합되지 않는 데이터가 있는지 확인

해보시기 바랍니다.

 


by DarkBee [2015.07.15 16:43:34]

테스트 해보니 null은 문제가 되진 않네요 : D 


by 창조의날개 [2015.07.15 16:41:51]

DarkBee님 글처럼 reqdt / reservedt / sentdt 중에 null이나 포멧이 맞지 않는 것이 있을거구요..

첫번째 쿼리는 토드등 툴에서는 데이터가 많은 경우 일부만 가져 오기 때문에 문제가 없어 보이지만..

ORDER BY를 하면 전체 데이터를 가져와서 정렬을 먼저 하기 때문에 에러가 납니다.


by 개논물 [2015.07.15 16:49:50]

확인해본결과 데이터가 이상있는건 아닌거 같네요 한건일때도 이런 오류가 나네요  그런데 

그 한건의 '20140715131405' 이문구를  reqdt 컬럼 명 대신에  직접 적어 넣으면 에러가 안나네요..

이럴 수가 있나요..... 


by 개발뉴비 [2015.07.15 16:51:29]

모든 데이터가 'YYYY-MM-DD HH24:MI:SS' 형식으로 입력되어 있는지 확인이 필요해보이네요

널값이 아니라도 해당 형식의 데이터가 아닐경우 오류가 날 수 있으니까요.


by 개논물 [2015.07.15 16:42:53]

본문에도 있듯이 

SELECT TO_DATE(reqdt, 'YYYY-MM-DD HH24:MI:SS') AS reqdt, 
 TO_DATE(RESERVEDT, 'YYYY-MM-DD HH24:MI:SS') AS RESERVEDT, 
 TO_DATE(SENTDT, 'YYYY-MM-DD HH24:MI:SS') AS SENTDT
 FROM MSGSUMMARY 
 WHERE 1=1 
 AND userid = 'test'  

이렇게 실행시켰을때는 오류 없이 잘나옵니다 데이터 포멧도 잘되구요 ㅜㅜ 

DarkBee  님 말씀 되로 라면 위에 쿼리도 에러가 나야겠지요... 답변 감사드립니다.

 

 


by 개논물 [2015.07.15 16:45:06]

전체를 먼저 불러와서 그럴수도 있겠네요 다시한번 확인해 보겠습니다 답변 감사드립니다.


by 창조의날개 [2015.07.15 16:50:15]

-- 이렇게 한번 찾아 보시면 좋을듯..

SELECT *
FROM MSGSUMMARY
WHERE REGEXP_REPLACE(reqdt,'....-..-.. ..:..:..') IS NOT NULL
   OR REGEXP_REPLACE(RESERVEDT,'....-..-.. ..:..:..') IS NOT NULL
   OR REGEXP_REPLACE(SENTDT,'....-..-.. ..:..:..') IS NOT NULL
;

 


by 개논물 [2015.07.15 16:53:02]

혹시 이 쿼리  뜻이 YYYY-MM-DD HH24:MI:SS 이포멧 아닌데이터를 찾아 내는게 맞는지요?

참고로 필드에는 20110831185644이런식으로 데이터가 들어가 있습니다..

 

참고로 

SELECT TO_DATE(reqdt, 'YYYY-MM-DD HH24:MI:SS') AS reqdt, 
 TO_DATE(RESERVEDT, 'YYYY-MM-DD HH24:MI:SS') AS RESERVEDT, 
 TO_DATE(SENTDT, 'YYYY-MM-DD HH24:MI:SS') AS SENTDT
 FROM MSGSUMMARY 

이렇게 실행 시켜봤더니 잘됩니다.


by 개발뉴비 [2015.07.15 16:57:14]

데이터에 맞게 형식 지정을 해야 오류가 나지 않습니다.

TO_DATE(reqdt, 'YYYYMMDDHH24MISS') 이렇게 해서 돌려보세요~


by 창조의날개 [2015.07.15 16:59:21]

-- 네 맞습니다.
-- 데이터 포멧이 그렇다면 아래와 같이 쿼리를 정확히 해주시면 좋겠네요..
SELECT TO_DATE(reqdt, 'YYYYMMDDHH24MISS') AS reqdt, 
 TO_DATE(RESERVEDT, 'YYYYMMDDHH24MISS') AS RESERVEDT, 
 TO_DATE(SENTDT, 'YYYYMMDDHH24MISS') AS SENTDT
 FROM test
 WHERE 1=1 
 AND userid = 'test'
;

-- 그리고 해당 에러는 아마도 자리수가 너무 많아서 생기는게 아닐가 싶은데요..
-- 아래 처럼 한번 찾아 보시죠..
SELECT *
FROM MSGSUMMARY
WHERE LENGTH(reqdt) != 14
   OR LENGTH(RESERVEDT) != 14
   OR LENGTH(SENTDT) != 14
;

 


by 개논물 [2015.07.15 17:01:31]

개발뉴비 //

SELECT TO_DATE(reqdt, 'YYYYMMDDHH24MISS') AS reqdt, 
 TO_DATE(RESERVEDT, 'YYYYMMDDHH24MISS') AS RESERVEDT, 
 TO_DATE(SENTDT, 'YYYYMMDDHH24MISS') AS SENTDT
 FROM MSGSUMMARY  

이렇게 하닌깐 잘되는데 

 

SELECT TO_DATE(reqdt, 'YYYYMMDDHH24MISS') AS reqdt, 
 TO_DATE(RESERVEDT, 'YYYYMMDDHH24MISS') AS RESERVEDT, 
 TO_DATE(SENTDT, 'YYYYMMDDHH24MISS') AS SENTDT
 FROM MSGSUMMARY  ORDER BY CODE

이렇게 하닌깐

ORA-01839: date not valid for month specified 이런 에러가 뜨네요 ?   답변 감사합니다.

 


by 개논물 [2015.07.15 17:02:21]

창조날개//

SELECT *
FROM MSGSUMMARY
WHERE LENGTH(reqdt) != 14
   OR LENGTH(RESERVEDT) != 14
   OR LENGTH(SENTDT) != 14
;

실행결과 값이 없습니다.. 답변감사합니다.


by 마농 [2015.07.15 17:23:27]
-- 에러메시지 보면 month 가 틀렸다는 걸 친절하게 알려주네요.
-- 에러메시지 속에 답이 있습니다.
SELECT *
  FROM MSGSUMMARY
 WHERE SUBSTR(reqdt, 5, 2) NOT IN
       ('01','02','03','04','05','06','07','08','09','10','11','12')
;

 


by 개논물 [2015.07.15 17:25:58]

//마농님... 

SELECT *
  FROM MSGSUMMARY
 WHERE SUBSTR(reqdt, 5, 2) NOT IN
       ('01','02','03','04','05','06','07','08','09','10','11','12')

실행결과  데이터가 없습니다. ㅜ
 


by 마농 [2015.07.15 17:27:13]

다른 항목들도 확인 했나요?


by 개논물 [2015.07.15 17:27:20]

미친척하고 

페이징으로 

SELECT rownumber ,
       code, 
       TO_DATE(RESERVEDT, 'YYYY-MM-DD HH24:MI:SS') AS RESERVEDT, 
       TO_DATE(SENTDT, 'YYYY-MM-DD HH24:MI:SS') AS SENTDT, 
       TO_DATE(reqdt, 'YYYY-MM-DD HH24:MI:SS') AS reqdt 
  FROM 
       (SELECT ROWNUM rownumber, 
              code, 
              RESERVEDT ,
              reqdt , 
              SENTDT 
         FROM 
              (SELECT code ,
                     RESERVEDT, 
                     SENTDT, 
                     reqdt 
                FROM MSGSUMMARY 
            ORDER BY code 
              )a 
       )b 
 WHERE rownumber >=1 
       AND rownumber <= 37959  

 

쿼리를 짰더니, 에러가 안나네요..  알다가도 모르겠습니다.. 


by 개논물 [2015.07.15 17:28:47]

마뇽//

reqdt, SENTDT, RESERVEDT  다 했는데요  데이터가 업습니다.ㅜ


by DarkBee [2015.07.15 17:33:11]
-- 펑션 생성

create or replace function F_ISDATE ( strDate IN varchar2 ) return VARCHAR is
  work date;
begin
  work := to_date(strDate,'yyyymmddhh24miss');
  return 'Y';
exception
when others then
  return 'N';
end;



-- 검증 ( N 인놈을 찾으세요 )
SELECT F_ISDATE ( reqdt     ) a
     , F_ISDATE ( reservedt ) b
     , F_ISDATE ( sentdt    ) c
  FROM MSGSUMMARY
 ORDER BY LEAST ( a, b, c )

 


by 마농 [2015.07.15 17:39:46]

아 제가 에러메시지를 착각했네요.
ORA-01843: not a valid month
  ==> 월이 틀린 경우
ORA-01839: date not valid for month specified
  ==> 월에대한 날짜가 틀린경우 ('0229', '0631' 등)


by 개논물 [2015.07.15 18:02:10]

일딴 너무 급해서  위에 페이징 방식으로 처리 했네요 답변들 너무 감사합니다.! 감사합니다!

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