쿼리 질문입니다. 0 2 790

by 후인구 [2019.10.07 21:06:44]


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로 조회되어야 합니다.

 

고수님들의 조언 부탁드립니다

by jkson [2019.10.08 08:20:43]

일단 조회 컬럼에 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
                    

 


by 마농 [2019.10.08 08:50:35]
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'
;

 

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