我不知道如果這些日子是每週或連續的,下面是如何處理這兩種情況的例子。
DECLARE
@StartDate date = '20160801',-- - 1st Aug 2016
@EndDate date = '20160930', --30th Sept 2016
@MaxCourses tinyint = 5,
@startDay varchar(10) = 'Tuesday';
-- if you need the next 5 tuesdays
WITH
E1(N) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) x(x)),
iTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1 FROM E1 a, E1 b, E1 c),
calendar(d) AS
(
SELECT TOP (DATEDIFF(DAY,@StartDate,@EndDate)) DATEADD(DAY,N,@startDate)
FROM itally
)
SELECT TOP(@MaxCourses) d
FROM calendar
WHERE DATENAME(WEEKDAY,d) = @startDay;
-- if you need the next 5 days
WITH
E1(N) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) x(x)),
iTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1 FROM E1 a, E1 b, E1 c),
calendar(N,d) AS
(
SELECT TOP (DATEDIFF(DAY,@StartDate,@EndDate)) N, DATEADD(DAY,N,@startDate)
FROM itally
),
md(d1) AS (SELECT MIN(d) FROM calendar WHERE DATENAME(WEEKDAY,d) = @startDay)
SELECT TOP (@MaxCourses) d = DATEADD(day,N,d1)
FROM calendar CROSS JOIN md;
請出示樣品輸出 – TheGameiswar
2016年2月8日 2016年9月8日 16/08/2016 23/08/2016 30/08/2016 – Dough