2013-08-07 5 views
1

StackOverflow (How to split date ranges based on months in SQL Server 2005)에 다른 기사를 사용하여 나는 달로 날짜 범위를 나누어 SQL에 2 열 (DateFrom, DateTo)을 반환하는 SELECT 문을 실행했습니다.SQL - 결과를 쉼표로 구분 된 문자열로 변환합니다.

DECLARE @SDate DATE = '2012/08/01' 
DECLARE @EDate DATE = '2013/09/01' 

SELECT 
    DATEADD(MONTH, n.Number, @SDate) as DateFrom, 
    DATEADD(day, -1, DATEADD(MONTH, n.Number, DATEADD(YEAR,-1,@EDate))) as DateTo 
FROM 
    master.dbo.spt_values n 
WHERE 
    n.Number < DATEDIFF(MONTH, @SDate, @EDate) 
    AND n.Type = 'P' 

는 지금 | (Dateto|Datefrom)에 의해 열을 분리하는 문자열과 ,하여 각 행에 반환 된 각 행을 추가해야합니다.

예를 들어

당신의 것입니다 결과 위의 코드를 실행하면 (그냥 예를 들어 메신저는 처음 4 개 행을 사용하는하지만 하나 개의 문자열에 모두 필요) :

R | Date From | Date To 
1 | 2012-08-01 | 2012-08-31 
2 | 2012-09-01 | 2012-09-30 
3 | 2012-10-01 | 2012-10-30 
4 | 2012-11-01 | 2012-11-30 

코드 :

에서

2012-08-01|2012-08-31,2012-10-01|2012-10-30,2012-10-01|2012-10-30,2012-11-01|2012-11-30 

내가 시도 몇 가지 제안을 : 내가 돌아 PRINT 필요 무엇

DECLARE @stralldates VarChar(MAX) 
/* SET @stralldates = INSERTCODE */ 
PRINT @stralldates 

StackOverflow에 대한 비슷한 질문 (예 : CONCAT)은 성공하지 못합니다.

도움이나 의견을 보내 주시면 감사하겠습니다.

답변

3
set @StrAllDates = 
    stuff((select ','+convert(char(10), SDate, 121)+'|'+convert(char(10), dateadd(day, -1, dateadd(month, 1, SDate)), 121) 
     from (
       select dateadd(month, n.number, @SDate) as SDate 
       from master..spt_values as n 
       where n.number < datediff(month, @SDate, @EDate) and 
        n.type = 'P' 
      ) as T 
     order by SDate 
     for xml path('')), 1, 1, '') 
+0

도움을 주셔서 감사합니다. 바로 내가 필요한 것! –

1

버전에 따라 wm_concat (문서화되지 않음) 또는 listagg를 제공하는 Oracle 만 알고 있습니다.

+0

지금 답변을 얻었지만 도움을 주셔서 감사합니다. –

1

아래 스크립트를 사용하여 원하는 형식으로 데이터를 가져올 수 있습니다. 기본적으로 concatenanation을 위해 합치는 방법을 사용합니다. 필자는 임시 테이블을 만들어 데이터를 보관하고 행을 반복하는 데 사용했습니다. 당신이 행 rumber을 사용하려는 경우 또한

DECLARE @SDate DATE = '2012/08/01' 
DECLARE @EDate DATE = '2013/09/01' 
SELECT 
    DATEADD(MONTH, n.Number, @SDate) as DateFrom, 
    DATEADD(day, -1, DATEADD(MONTH, n.Number, DATEADD(YEAR,-1,@EDate))) as DateTo 
INTO #tmp_data 
FROM master.dbo.spt_values n 
WHERE 
n.Number < DATEDIFF(MONTH, @SDate, @EDate) 
AND n.Type = 'P' 

declare @my_string varchar(8000); 
select @my_string = 
    coalesce(@my_string + ',', '') 
    + convert(varchar(10), d.DateFrom, 126) 
    + '|' + convert(varchar(10), d.DateTo, 126) 
from #tmp_data d 
order by d.DateFrom 
select @my_string 

drop table #tmp_data 

, 당신은 select 절에 다른 열을 추가하여 사용할 수 있습니다 - ROW_NUMBER() OVER(ORDER BY n.Number) as RowNum

+0

이 대답은 날짜가 오름차순으로 연결된 것을 보장하지 않습니다. OP만이 문제인지 아닌지를 알 수 있습니다. –

+0

@Mikael Eriksson 나는 하나의 대답 만 표시 할 수 있다는 것을 깨닫지 못했지만 유혹을 사용하는 것이 효율적이지는 않을 것이라고 생각합니다. 하지만 당신 도움 siddharth 주셔서 감사합니다! –

+0

감사합니다. @MikaelEriksson - 임시 테이블에서 선택할 때 항상 order by 절을 추가 할 수 있습니다. – siddharth

1

는 다음 쿼리는 당신에게 필요한 쉼표로 분리 된 문자열을 줄 것이다 :

DECLARE @Begin DATETIME 
DECLARE @End DATETIME 
Declare @test Table(startDate datetime, endDate datetime) 
DECLARE @listStr VARCHAR(MAX) 
SELECT @Begin = '20110101', @End = '20120101' 

Insert into @test 
SELECT DATEADD(MONTH, n.Number, @Begin) DateFrom, DATEADD(day, -1, DATEADD(MONTH, n.Number+1, @Begin)) DateTo 
FROM master.dbo.spt_values n 
WHERE 
    n.Number <= DATEDIFF(MONTH, @begin, @end) 
AND n.Type = 'P' 

select @listStr = COALESCE(@listStr+',' ,'')+ CONVERT(VARCHAR(10), startDate, 120) + '|' + CONVERT(varchar(10),endDate,120) from @test 
select @listStr 
관련 문제