T-SQL CTE周序列

时间:2014-02-07 13:47:07

标签: tsql

我正在尝试写一个递归的CTE给我一系列星期一,从第38周开始,为期6年的未来20周。我需要绘制过去6年的每周销售数据,并认为递归CTE是动态创建星期一日期序列的最佳方法。这有点复杂,因为这个季节会持续到明年。以下是我希望记录集看起来如何的示例:

9/17/2012
9/24/2012
10/1/2012
10/8/2012
10/15/2012
10/22/2012
10/29/2012
11/5/2012
11/12/2012
11/19/2012
11/26/2012
12/3/2012
12/10/2012
12/17/2012
12/24/2012
12/31/2012
1/7/2013
1/14/2013
1/21/2013
1/28/2013
2/4/2013
2/11/2013
2/18/2013
2/25/2013
9/16/2013  <-next season start
9/23/2013
9/30/2013
10/7/2013
10/14/2013
10/21/2013
10/28/2013
11/4/2013
11/11/2013
11/18/2013
11/25/2013
12/2/2013
12/9/2013
12/16/2013
12/23/2013
12/30/2013
1/6/2014
1/13/2014
1/20/2014
1/27/2014
2/3/2014
2/10/2014
2/17/2014
2/24/2014

我不知道这是否可行,但似乎可能。我以为我可能不得不使用多个CTE来实现这一目标,但我真的很难如何做到这一点。非常感谢任何帮助或指导。

2 个答案:

答案 0 :(得分:1)

所以我明白了。 valverij的回答也会起作用。这是我用2个递归CTE得出的结果。如果有人发现任何问题,请告诉我。

WITH Seasons(StartDate) AS
(
    SELECT DATEADD(m, 4, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)) AS StartDate UNION ALL
    SELECT DATEADD(yy, -1, StartDate)
    FROM Seasons
    WHERE YEAR(StartDate) > YEAR(GETDATE()) - 6
),
Weeks(StartDate, WeekStartDate) AS
(
    SELECT DATEADD(d, 1 - DATEPART(dw, DATEADD(wk, 20, Seasons.StartDate)), DATEADD(wk, 20, Seasons.StartDate)), DATEADD(d, 1 - DATEPART(dw, DATEADD(wk, 20, Seasons.StartDate)), DATEADD(wk, 20, Seasons.StartDate)) AS WeekStartDate
    FROM Seasons UNION ALL
    SELECT StartDate, DATEADD(wk, 1, WeekStartDate)
    FROM Weeks
    WHERE (WeekStartDate < DATEADD(wk, 23, StartDate))
)
SELECT StartDate, WeekStartDate
FROM Weeks
ORDER BY WeekStartDate DESC

答案 1 :(得分:0)

如果您只是在桌子上寻找星期一,可以使用DATENAME(WEEKDAY, [ColumnName])来测试星期一。

例如,以下代码会在假设的SaleDates表中找到所有星期一Sales

SELECT *
FROM Sales
WHERE DATENAME(WEEKDAY, SaleDate) = 'Monday'

从那里,您可以应用您需要的任何其他条件(开始日期,结束日期等)

现在,如果您只想生成所有星期一的列表,可以使用表变量和WHILE循环:

DECLARE @Mondays TABLE(MondayDate datetime)
DECLARE @CurrentDate datetime = '02/07/2013' -- one year ago

WHILE @CurrentDate <= GETDATE() BEGIN
    IF DATENAME(WEEKDAY, @CurrentDate) = 'Monday'
        INSERT INTO @Mondays VALUES(@CurrentDate)
    SET @CurrentDate = @CurrentDate + 1
END

SELECT *
FROM @Mondays

无论哪种方式,我绝对不认为你需要CTE才能实现这一目标。