在StackOverflow上使用另一篇文章(How to split date ranges based on months in SQL Server 2005)我运行了一个SELECT
语句,该语句按月拆分日期范围,并在SQL中返回2列(DateFrom, DateTo
)。
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
我需要PRINT返回:
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
)但没有成功。
任何帮助或建议都将不胜感激。
答案 0 :(得分: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, '')
答案 1 :(得分:1)
我只知道Oracle提供wm_concat(未记录的)或listagg,具体取决于版本。
答案 2 :(得分:1)
您可以使用以下脚本以您想要的格式获取数据。它基本上使用合并方法进行连接。我创建了一个临时表来保存数据,然后用于迭代行。
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,你可以使用另一列来添加它来使用它 - ROW_NUMBER() OVER(ORDER BY n.Number) as RowNum
答案 3 :(得分: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