문자타입을 날짜타입으로 변환 시 ora-01843, ora-01847 에러 1 2 2,660

by 도가니 [Oracle 기초] to_date ora-01843 ora-01847 [2018.02.13 11:16:52]


안녕하세요,

데이터를 조회하다 문득 궁금해져 질문 올립니다.

문자타입으로 설정 된 날짜컬럼을 to_date()로 변환 시 '0180213'이나 '20180132' 처럼 형식이 잘못된 데이터만 조회 할 수 있는 쿼리가 혹시 있을까요?

프로시저나 펑션 만들기전에 혹시나 있을까 해서 질문 드립니다.

감사합니다.

by 마농 [2018.02.13 13:16:05]
WITH t AS
(
SELECT '0180213' dt FROM dual
UNION ALL SELECT '20180131' FROM dual
UNION ALL SELECT '20180132' FROM dual
UNION ALL SELECT '20180200' FROM dual
UNION ALL SELECT '20180228' FROM dual
UNION ALL SELECT '20180229' FROM dual
UNION ALL SELECT '18.02.28' FROM dual
)
SELECT *
  FROM t
     , XMLTABLE('if (. castable as xs:date) then 1 else 0' PASSING dt COLUMNS x NUMBER PATH '.')
 WHERE x = 0
    OR NOT REGEXP_LIKE(dt, '[0-9]{8}')
;

 


by 우리집아찌 [2018.02.13 13:58:35]

0. 마농님건.. 좀더 연구해야...

1.사용자 함수 사용

http://scidb.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4%EC%97%90%EC%84%9C-isnumber-isdate-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

2.정규식 ( 윤년등에 완벽하게 대응되지 않습니다. )

WITH T AS
(
SELECT '0180213' dt FROM dual
UNION ALL SELECT '20180131' FROM dual
UNION ALL SELECT '20180132' FROM dual
UNION ALL SELECT '20180200' FROM dual
UNION ALL SELECT '20180228' FROM dual
UNION ALL SELECT '20180229' FROM dual
UNION ALL SELECT '18.02.28' FROM dual
UNION ALL SELECT '20181229' FROM dual
)   
SELECT DT
     , REGEXP_INSTR( DT, '([20]{2}[0-9]{2})(0[1-9]|1[1-2])(0[1-3]|1[0-9]|2[0-9]|3[0-1])')
  FROM T

3. 처음부터 DT 컬럼을 DATE TYPE 으로 한다. ( 강추합니다.)

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