안녕하세요.
번호 | 제목 | 시작일 | 종료일 |
1 | 휴가 | 2015-09-01 | 2015-09-05 |
2 | 추석 | 2015-09-26 | 2015-09-29 |
위와같은 데이터를 하위표처럼 시작일~종료일 만큼 행으로 출력하고 싶습니다.
도움 부탁드립니다.
번호 | 제목 | 일자 |
1 | 휴가 | 2015-09-01 |
1 | 휴가 | 2015-09-02 |
1 | 휴가 | 2015-09-03 |
1 | 휴가 | 2015-09-04 |
1 | 휴가 | 2015-09-05 |
2 | 추석 | 2015-09-26 |
2 | 추석 | 2015-09-27 |
2 | 추석 | 2015-09-28 |
2 | 추석 | 2015-09-29 |
|
------------------------------------------------------------------------------------------------
커서를 이용하여 원하는 결과값을 얻어내긴했습니다만....
데이터가 많을때는 성능에 문제가 있겠군요...
동일한 결과를 낼수있는 다른방법이 있다면 공유해주시면 감사하겠습니다.
------------------------------------------------------------------------------------------------
DECLARE @T_TARGET TABLE
(
[NO] INT
,TITLE VARCHAR(50)
,SDATE VARCHAR(10)
,EDATE VARCHAR(10)
)
INSERT INTO @T_TARGET VALUES(1, '휴가', '2015-09-01', '2015-09-05')
INSERT INTO @T_TARGET VALUES(2, '추석', '2015-09-26', '2015-09-29')
DECLARE @T_RESULR TABLE
(
[NO] INT
,TITLE VARCHAR(50)
,[DATE] VARCHAR(10)
)
DECLARE @NO INT
DECLARE @TITLE VARCHAR(50)
DECLARE @SDATE VARCHAR(10)
DECLARE @EDATE VARCHAR(10)
DECLARE @DAY INT = 0
DECLARE _CURSOR CURSOR
FOR
SELECT [NO], [TITLE], SDATE, EDATE FROM @T_TARGET
OPEN _CURSOR
FETCH NEXT FROM _CURSOR INTO @NO, @TITLE, @SDATE, @EDATE
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DAY = 0
-------------- 실행쿼리---------------
WHILE (DATEADD(DD, @DAY, @SDATE) <= DATEADD(DD, 0, @EDATE)) BEGIN
INSERT INTO @T_RESULR VALUES(@NO, @TITLE, CONVERT(VARCHAR(10), DATEADD(DD, @DAY, @SDATE), 121))
SET @DAY = @DAY + 1
END
-------------- 실행쿼리종료---------------
FETCH NEXT FROM _CURSOR INTO @NO, @TITLE, @SDATE, @EDATE
END
CLOSE _CURSOR
DEALLOCATE _CURSOR
SELECT * FROM @T_RESULR
커서중 select 형태를 대체 할수 있는 기능 중 하나가 cross (outer) apply 가 있습니다.
이걸 이용하시면 좀더 간단하게 쿼리를 날릴수 있습니다.
with res(번호, 제목 ,시작일, 종료일 )
as (
select 1 ,'휴가' ,'2015-09-01' ,'2015-09-05' union all
select 2 ,'추석' ,'2015-09-26' ,'2015-09-29'
)
select a.번호
, a.제목
, convert(varchar(10), dateadd(dd,b.number,a.시작일), 120) [일자]
from res a
cross apply
(
select number
from master.dbo.spt_values
where type ='P'
and number <= DATEDIFF( dd,a.시작일, a.종료일)
) b