날짜 범위에 속해있는 일수 count 구하기 0 3 4,122

by 웁스 [2012.01.02 14:55:34]


활성화 기간 : 2011.12.21 ~ 2011.12.25
조회 기간 : 2011.12.23 ~ 2011.12.27
조회 기간의 날짜 범위 안에 활성화 기간의 날짜가 포함된 갯수를 구하고 싶을 때 쿼리를 어떻게 만들어야 할지 고민입니다.
결국 산출되는 데이터 값은 "3"이라는 값 입니다. (23일, 24일, 25일)

고민을 해봤지만 잘 안되네요.
힌트라도 주시면 감사하겠습니다.
by 옵티마이즈 [2012.01.02 15:05:55]
select sum(case when 활성화기간 between '20111221' and '20111225' then 1 else 0 end) as totalcount from TABLE where 조회기간 between '20111223' and '20111227'

이런식으로 하면 되지 않을까 하는데.. 성능은 어떨지 모르겠네요..
만일 select시 sum구문이 여러개 들어간다면 성능이 어떤지 아시는분 답변좀 부탁드려요 ^^

select
sum(case when 활성화기간 between '20111201' and '20111210' then 1 else 0 end) as count1,
sum(case when 활성화기간 between '20111211' and '20111220' then 1 else 0 end) as count2,
sum(case when 활성화기간 between '20111221' and '20111230' then 1 else 0 end) as count3
from TABLE where 조회기간 between '20111201' and '20111230'

by 마농 [2012.01.02 15:18:53]
WITH t AS
(
SELECT '20111221' sdt, '20111225' edt, '활성' st FROM dual
UNION ALL SELECT '20111221', '20111228', '활성' st FROM dual
UNION ALL SELECT '20111224', '20111225', '활성' st FROM dual
UNION ALL SELECT '20111227', '20111228', '활성' st FROM dual
)
SELECT sdt, edt, st
, TO_DATE(LEAST(edt, :v_edt), 'yyyymmdd')
- TO_DATE(GREATEST(sdt, :v_sdt), 'yyyymmdd')
+ 1 AS cnt
FROM t
WHERE st = '활성'
AND edt >= :v_sdt -- '20111223'
AND sdt <= :v_edt -- '20111227'
;

by 웁스 [2012.01.02 17:56:03]
옵티마이즈, 마농님 답변 감사합니다.
덕분에 해결했네요. ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입