1

使用 StackOverflow 上的另一篇文章(如何在 SQL Server 2005 中根据月份拆分日期范围)我运行了一条SELECT语句,该语句按月份拆分日期范围并DateFrom, DateTo在 SQL 中返回 2 列 ()。

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),但没有成功。

任何帮助或建议将不胜感激。

4

4 回答 4

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, '')
于 2013-08-07T09:39:55.507 回答
1

我只知道 Oracle 根据版本提供 wm_concat (未记录)或 listagg 。

于 2013-08-07T09:36:49.833 回答
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,您可以通过在 select 子句中添加另一列来使用它 -ROW_NUMBER() OVER(ORDER BY n.Number) as RowNum

于 2013-08-07T09:53:46.000 回答
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
于 2013-08-07T10:45:54.807 回答