2013-08-07 118 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 
相关问题