날짜 타입잘못된거 찾기 0 4 1,690

by 자바천재 [2014.09.12 10:46:27]


WITH T1 AS (
        SELECT '20141005' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20140931' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20140831' JOINDATE FROM DUAL
)
SELECT *
FROM T1
WHERE JOINDATE NOT IN (
    SELECT to_char(to_date(MIN_JOINDATE,'yyyymmdd') + level - 1, 'yyyymmdd') dt
    FROM (
        SELECT MIN(JOINDATE) MIN_JOINDATE, MAX(JOINDATE) MAX_JOINDATE
        FROM T1
    ) A
     connect by level <= to_date(MAX_JOINDATE,'yyyymmdd') - to_date(MIN_JOINDATE,'yyyymmdd') + 1
)

 

이런식으로 날짜타입이 잘못들어간것을 찾으려니 너무 오래 걸리네요

혹시 좋은방법이 있을까요?

by 우리집아찌 [2014.09.12 11:01:53]

http://www.gurubee.net/article/41514

댓글에 사용자함수 쓰는방법있어요..


by 자바천재 [2014.09.12 11:11:13]

감사합니다 ^^


by 마농 [2014.09.12 11:36:32]

1. NOT IN 을 사용하셔서 느린 것입니다.
  - 아우터 조인후에 널인 자료를 찾는 방식으로 바꾸세요.
2. Min, Max 범위를 잡으셨는데요?
  - Min, Max 값 자체가 오류일 가능성도 있겠지요?
  - 굳이 테이블 뒤져서 min, max 찾지 마시고, 그냥 상수값으로 범위를 정하세요.


by 꼬랑지 [2014.09.15 17:30:55]

WITH T1 AS (
        SELECT '20141005' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20140931' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20140831' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20120229' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20130229' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20140229' JOINDATE FROM DUAL
        UNION ALL
        SELECT '20140800' JOINDATE FROM DUAL
)
SELECT
    JOINDATE,FIRST_DAY,LAST_DAY
    ,CASE WHEN JOINDATE BETWEEN FIRST_DAY AND LAST_DAY THEN 'A' ELSE 'B' END FLAG
FROM (
    SELECT
        JOINDATE
        ,TO_CHAR(TO_DATE(SUBSTR(JOINDATE,1,6),'YYYYMM'),'YYYYMMDD') FIRST_DAY
        ,TO_CHAR(LAST_DAY(TO_DATE(SUBSTR(JOINDATE,1,6),'YYYYMM')),'YYYYMMDD') LAST_DAY
    FROM T1
)
;

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