Sql 开始日期和结束日期之间的一系列季度日期

Sql 开始日期和结束日期之间的一系列季度日期,sql,sql-server-2008-r2,common-table-expression,Sql,Sql Server 2008 R2,Common Table Expression,我有一个递归cte来生成@startDate和@endDate之间的日期列表,按季度递增 declare @startDate datetime declare @endDate datetime set @startDate= '01-jan-2014' set @endDate= '01-jul-2017' ;With cte As ( Select @startDate date1 Union All Select DateAdd(Month,3,date1) From cte w

我有一个递归cte来生成@startDate和@endDate之间的日期列表,按季度递增

declare @startDate datetime
declare @endDate datetime

set @startDate= '01-jan-2014'
set @endDate= '01-jul-2017'

;With cte
As
( Select @startDate date1
Union All
Select DateAdd(Month,3,date1)   From cte where date1 < @endDate 
) select cast(cast( Year(date1)*10000 + MONTH(date1)*100 + 1 as 
varchar(255)) as date) quarterlyDates From cte
我想将cte的输出连接成一个字符串,如下所示:

"'01-jan-2014', '01-apr-2014, '01-jul-2014'..." 

等等。我对这最后一步感到困惑-任何帮助都将不胜感激

不知道你为什么想。。。但只要把底部的cte包起来,用一些东西

declare @table table(quarterlyDates date)
insert into @table
values
('2014-01-01'),
('2014-04-01'),
('2014-07-01'),
('2014-10-01')

SELECT stuff((
    SELECT ', ' + cast(quarterlyDates as varchar(max))
    FROM @table
    FOR XML PATH('')
    ), 1, 2, '')
在你的代码中。。。虽然第二个CTE不是必需的,但为了清晰起见,我将其保留

declare @startDate datetime
declare @endDate datetime

set @startDate= '01-jan-2014'
set @endDate= '01-jul-2017'

;With cte
As
( Select @startDate date1
Union All
Select DateAdd(Month,3,date1)   From cte where date1 < @endDate 
), 

cte2 as(
select cast(cast( Year(date1)*10000 + MONTH(date1)*100 + 1 as 
varchar(255)) as date) quarterlyDates From cte)

SELECT stuff((
    SELECT ', ' + cast(quarterlyDates as varchar(max))
    FROM cte2
    FOR XML PATH('')
    ), 1, 2, '');

不知道你为什么想。。。但只要把底部的cte包起来,用一些东西

declare @table table(quarterlyDates date)
insert into @table
values
('2014-01-01'),
('2014-04-01'),
('2014-07-01'),
('2014-10-01')

SELECT stuff((
    SELECT ', ' + cast(quarterlyDates as varchar(max))
    FROM @table
    FOR XML PATH('')
    ), 1, 2, '')
在你的代码中。。。虽然第二个CTE不是必需的,但为了清晰起见,我将其保留

declare @startDate datetime
declare @endDate datetime

set @startDate= '01-jan-2014'
set @endDate= '01-jul-2017'

;With cte
As
( Select @startDate date1
Union All
Select DateAdd(Month,3,date1)   From cte where date1 < @endDate 
), 

cte2 as(
select cast(cast( Year(date1)*10000 + MONTH(date1)*100 + 1 as 
varchar(255)) as date) quarterlyDates From cte)

SELECT stuff((
    SELECT ', ' + cast(quarterlyDates as varchar(max))
    FROM cte2
    FOR XML PATH('')
    ), 1, 2, '');
使用带有类型指令的XML路径避免对结果中的非法字符进行编码

;WITH cte 
     AS (SELECT @startDate date1 
         UNION ALL 
         SELECT Dateadd(month, 3, date1) 
         FROM   cte 
         WHERE  date1 < @endDate) 
SELECT Stuff((SELECT ',' + CONVERT(VARCHAR(15), date1, 106) quarterlyDates 
              FROM   cte 
              FOR xml path, type).value('.[1]', 'nvarchar(max)'), 1, 1, ''); 
注意:我已在最终选择中更改了不需要的操作。在Convert函数中使用style 106获取所需的输出格式

用于XML Path with type指令,以避免对结果中的非法字符进行编码

;WITH cte 
     AS (SELECT @startDate date1 
         UNION ALL 
         SELECT Dateadd(month, 3, date1) 
         FROM   cte 
         WHERE  date1 < @endDate) 
SELECT Stuff((SELECT ',' + CONVERT(VARCHAR(15), date1, 106) quarterlyDates 
              FROM   cte 
              FOR xml path, type).value('.[1]', 'nvarchar(max)'), 1, 1, ''); 

注意:我已在最终选择中更改了不需要的操作。使用Convert函数中的style 106获得所需的输出格式,只是为了好玩

范例


迟回答,只是为了好玩

范例


什么在消耗这些输出?逗号分隔的数据不是SQLServer中表示多个值的自然方式,不像表或XML中的行。如果消耗这些数据的东西也不能自然地将数据表示为逗号分隔的数据,也许我们可以避免不必要的转换?它将以字符串的形式出现在一些动态sql中,您可能是对的,它不需要以字符串的形式出现,但是SQL并不是我天生的家,所以我正在慢慢地构建…要么可以避免动态SQL,要么可以用这些数据填充临时表-外部作用域中的临时表可以在动态SQL中访问,这将使数据更自然地表示出来。好的-谢谢。我已经将另一个响应标记为已接受,但我也会检查临时表的作用域-这很有用。这并不是真正针对您的连接问题,但我再次推荐我最喜欢的答案,即使用日期维度/日历表来帮助预算您需要的日期。每个数据库都应该有一个。它既能让你的查询更快,也能让你的生活更轻松。是什么消耗了这些输出?逗号分隔的数据不是SQLServer中表示多个值的自然方式,不像表或XML中的行。如果消耗这些数据的东西也不能自然地将数据表示为逗号分隔的数据,也许我们可以避免不必要的转换?它将以字符串的形式出现在一些动态sql中,您可能是对的,它不需要以字符串的形式出现,但是SQL并不是我天生的家,所以我正在慢慢地构建…要么可以避免动态SQL,要么可以用这些数据填充临时表-外部作用域中的临时表可以在动态SQL中访问,这将使数据更自然地表示出来。好的-谢谢。我已经将另一个响应标记为已接受,但我也会检查临时表的作用域-这很有用。这并不是真正针对您的连接问题,但我再次推荐我最喜欢的答案,即使用日期维度/日历表来帮助预算您需要的日期。每个数据库都应该有一个。它不仅让你的查询更快,而且让你的生活更轻松。