안녕하세요.
oracle 에서 mssql(2008) 로 변경하고 있습니다.
그런데 connect by level 에서 어려움에 부딪혔고
검색신공으로 힌트를 얻어 어찌 어찌 안의 내용은 풀어 헤쳤는데
(with cte 계층쿼리를 만들어주는 것) 크아~!!!
ㅜ.ㅜ 쿼리는 아래와 같습니다.
--오라클 쿼리
SELECT
(
SELECT
SUM(
CASE WHEN TO_DATE(START_DT,'YYYYMMDD')+LV-1 <= TO_DATE(END_DT, 'YYYYMMDD')
AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> '토'
AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> '일'
AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> 'SAT'
AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> 'SUN'
THEN 1 ELSE 0 END
)
FROM
(
SELECT LEVEL LV
FROM DUAL
CONNECT BY LEVEL<=TO_DATE('20091229','YYYYMMDD')-TO_DATE('20080123','YYYYMMDD')+1
)
) - (SELECT COUNT(HOLIDAY) CNT FROM TB_HOLIDAY WHERE HOLIDAY BETWEEN START_DT AND END_DT )
into wdate
FROM DUAL;
--위 쿼리를 변경중인 mssql 쿼리
DECLARE @WDATE INT
, @RET INT
, @START_DT VARCHAR(8)
, @END_DT VARCHAR(8)
SET @START_DT = '20080123'
SET @END_DT = '20091229';
SELECT @WDATE = ((
SELECT SUM(
CASE WHEN CONVERT(SMALLDATETIME, @START_DT)+LV-1 <= CONVERT(SMALLDATETIME,@END_DT)
AND TO_CHAR(CONVERT(SMALLDATETIME,@START_DT)+LV-1,'DY') <> '토'
AND TO_CHAR(CONVERT(SMALLDATETIME,@START_DT)+LV-1,'DY') <> '일'
AND TO_CHAR(CONVERT(SMALLDATETIME,@START_DT)+LV-1,'DY') <> 'SAT'
AND TO_CHAR(CONVERT(SMALLDATETIME, @START_DT)+LV-1,'DY') <> 'SUN'
THEN 1 ELSE 0 END
)
FROM(
--CONNECT BY LEVEL<=TO_DATE(@END_DT,'YYYYMMDD')-TO_DATE(@START_DT,'YYYYMMDD')+1
WITH CTE(LV) AS(
SELECT 1 LV
UNION ALL
SELECT LV+1 FROM CTE WHERE LV+1 <= DATEDIFF(DD, @START_DT, @END_DT)+1
)
SELECT * FROM CTE;
) A
) - (SELECT COUNT(HOLIDAY) AS CNT FROM TB_HOLIDAY WHERE HOLIDAY BETWEEN @START_DT AND @END_DT)
)
크흑크흑 ㅠ 어렵네요.
조언부탁드립니다.