by 도가니 [Oracle 기초] to_date ora-01843 ora-01847 [2018.02.13 11:16:52]
안녕하세요,
데이터를 조회하다 문득 궁금해져 질문 올립니다.
문자타입으로 설정 된 날짜컬럼을 to_date()로 변환 시 '0180213'이나 '20180132' 처럼 형식이 잘못된 데이터만 조회 할 수 있는 쿼리가 혹시 있을까요?
프로시저나 펑션 만들기전에 혹시나 있을까 해서 질문 드립니다.
감사합니다.
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}') ;
0. 마농님건.. 좀더 연구해야...
1.사용자 함수 사용
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 으로 한다. ( 강추합니다.)