SQL에서 조회시
name sdate edate
사용자1 20210104 20210104
사용자2 20210208 20210210
사용자3 20210302 20210302
이렇게 조회된 임시 데이블 값을 가지고 sdate 와 edate가 같지 않은 경우
sdate에 edate 일자까지 채워 넣고 싶습니다.
아래와 같이 sdate에 20210208 ~ 20210210 까지 찍어줌
name sdate edate
사용자1 20210104 20210104
사용자2 20210208 20210210
사용자2 20210209 20210210
사용자2 20210210 20210210
사용자3 20210302 20210302
edate는 동일값 혹은 NULL로 출력 되어도 무방
구글에서 시작일 종료일을 가지고 중간에 일자를 채줘 넣는 소스가 있는데
이걸 어떻게 응용해야 할지 모르겠습니다.
DECLARE @StartDateTime varchar(10)
DECLARE @EndDateTime varchar(10)
SET @StartDateTime = '20200831'
SET @EndDateTime = '20200904';
WITH DateRange(Dates, DateWD) AS
(
SELECT @StartDateTime as Date, convert(varchar(10),DATEPART(WEEKDAY, @StartDateTime),112)
UNION ALL
SELECT convert(varchar(10),DATEADD(d,1,Dates),112), convert(varchar(10),DATEPART(WEEKDAY, DATEADD(d,1,Dates)),112)
FROM DateRange
WHERE Dates < @EndDateTime
)
SELECT Dates, DateWD,DATENAME(WEEKDAY,Dates)
FROM DateRange
OPTION (MAXRECURSION 0)
-- DateRange를 먼저 선언하고 SQL에서 조회되는 데이터와 JOIN 으로 처리하시면 됩니다. -- 시작일/종료일은 변수처리 하셔도 되고, 한번만 사용할꺼면 그냥 입력하셔도 됩니다. WITH DateRange(Dates) AS ( SELECT '20210101' -- [시작일] : 필요한 전체 결과에 맞게 적절한 최소일자로 조절 UNION ALL SELECT CONVERT(VARCHAR(8),DATEADD(d,1,Dates),112) FROM DateRange WHERE Dates <= '20210331' -- [최종일] : 필요한 전체 결과에 맞게 적절한 최대일자로 조절 ) SELECT A.[name] , Dates AS sdate, A.edate AS edate FROM DateRange B INNER JOIN ( -- SQL에서 조회하는 쿼리 또는 결과데이터 SELECT '사용자1' AS [name], '20210104' AS sdate,'20210104' AS edate UNION ALL SELECT '사용자2', '20210208','20210210' UNION ALL SELECT '사용자3', '20210302','20210302' ) A ON B.Dates BETWEEN A.sdate AND A.edate ORDER BY A.[name], Dates
WITH t AS ( SELECT '사용자1' name, '20210104' sdate, '20210104' edate UNION ALL SELECT '사용자2', '20210208', '20210210' UNION ALL SELECT '사용자3', '20210302', '20210302' ) , t1 AS ( SELECT name, sdate, edate , sdate dt FROM t UNION ALL SELECT name, sdate, edate , CONVERT(VARCHAR(8), DATEADD(day, 1, dt), 112) dt FROM t1 WHERE dt < edate ) SELECT * FROM t1 ORDER BY name, dt ;