我正在尝试写一个递归的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来实现这一目标,但我真的很难如何做到这一点。非常感谢任何帮助或指导。
答案 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才能实现这一目标。