EID | FRDT | TODT |
A | 20171216 | 20180216 |
B | 20170601 | 20170831 |
C | 20171001 | 20171031 |
D | 20161201 | 20170131 |
TABLE NAME : ATT
SELECT EID, FRDT, TO DT FROM ATT;
EID | FRDT | TODT |
A | 20171216 | 20171231 |
B | 20170601 | 20170831 |
C | 20171001 | 20171031 |
D | 20161201 | 20170131 |
SELECT * FROM ATT
WHERE (TO_CHAR(FRDT,'YYYY') = '2017' OR TO_CHAR(TODT,'YYYY') = '2017')
조회조건으로 TODT 조건 기준으로 2017년으로 조회했을때는 맨위에 A옆에 TODT는 20171231로 조회되어야 하고
EID | FRDT | TODT |
A | 20171216 | 20180216 |
B | 20170601 | 20170831 |
C | 20171001 | 20171031 |
D | 20170101 | 20170131 |
SELECT * FROM ATT
WHERE (TO_CHAR(FRDT,'YYYY') = '2017' OR TO_CHAR(TODT,'YYYY') = '2017')
조회조건으로 FRDT 조건 기준으로 2017년으로 조회했을때는 맨위에 D옆에 FRDT는 20170101로 조회되어야 합니다.
고수님들의 조언 부탁드립니다
일단 조회 컬럼에 TO_CHAR등의 함수를 사용하는 것은 해당 컬럼이 인덱스 컬럼일 경우 인덱스 사용 불가하기 때문에
좋지 않습니다.
2016년도에 시작해서 2018년도에 종료하는 경우에 대한 고려도 해보아야하구요.
적어주신대로 하면 해당 데이터는 추출되지 않습니다.
일단 기간에 대한 탐색이라 생각하고 해당 데이터도 나오게 만들어 보면..
WITH ATT(EID, FRDT, TODT) AS ( SELECT 'A', TO_DATE('20171216','YYYYMMDD'), TO_DATE('20180216','YYYYMMDD') FROM DUAL UNION ALL SELECT 'B', TO_DATE('20170601','YYYYMMDD'), TO_DATE('20170831','YYYYMMDD') FROM DUAL UNION ALL SELECT 'C', TO_DATE('20171001','YYYYMMDD'), TO_DATE('20171031','YYYYMMDD') FROM DUAL UNION ALL SELECT 'D', TO_DATE('20161201','YYYYMMDD'), TO_DATE('20170131','YYYYMMDD') FROM DUAL ) SELECT DECODE(:GB,'F',GREATEST(FRDT,TO_DATE(:YYYY||'0101','YYYYMMDD')),FRDT) AS FRDT -- 시작일자 기준일 경우 GB에 F입력, 종료일기준일 경우 T입력 , DECODE(:GB,'T',LEAST(TODT,TO_DATE(:YYYY||'1231','YYYYMMDD')),TODT) AS TODT FROM ATT WHERE TO_DATE(:YYYY||'0101','YYYYMMDD') <= TODT AND TO_DATE(:YYYY||'1231','YYYYMMDD') >= FRDT
WITH att AS ( SELECT 'A' eid, '20171216' frdt, '20180216' todt FROM dual UNION ALL SELECT 'B', '20170601', '20170831' FROM dual UNION ALL SELECT 'C', '20171001', '20171031' FROM dual UNION ALL SELECT 'D', '20161201', '20170131' FROM dual ) SELECT eid , GREATEST(frdt, '20170101') frdt , LEAST (todt, '20171231') todt FROM att WHERE frdt <= '20171231' AND todt >= '20170101' ;