시작일 종료일 사이 일자 채워 넣기 0 5 976

by 고재원 [SQL Query] [2021.05.28 16:44:01]


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)

by 뉴비디비 [2021.05.30 21:51:31]
-- 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

 


by 마농 [2021.05.31 08:53:44]
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
;

 


by 동동동 [2021.06.01 10:43:06]

마농님

오라클용으로 쿼리변환 가능 하실까요?

 


by 마농 [2021.06.01 11:15:13]

by 동동동 [2021.06.01 12:46:58]

감사합니다..^^

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