2013-08-07 163 views
1

使用StackOverflow上的另一篇文章(How to split date ranges based on months in SQL Server 2005)我運行了一條SELECT語句,它按月分割日期範圍,並在SQL中返回2列(DateFrom, DateTo)。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 

代碼:

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

我需要打印的內容返回:從

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

我嘗試了好幾種建議關於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

我只知道Oracle根據版本提供了wm_concat(未記錄)或listagg。

+0

我已經得到了答案,但感謝您的幫助! –

1

您可以使用下面的腳本以您想要的格式獲取數據。它基本上使用coalesce方法進行並置。我創建了一個臨時表來存放用於遍歷行的數據。

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 

另外,如果你想使用該行rumber,您可以使用添加另一列select子句中使用它 - ROW_NUMBER() OVER(ORDER BY n.Number) as RowNum

+0

此答案不保證日期按升序排列。只有OP會知道這是否有問題。 –

+0

@Mikael Eriksson我沒有意識到你只能標記一個答案,我猜測使用temptable的效率不會那麼高。但謝謝你的幫助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 
相關問題