2016-03-21 40 views

回答

0
; with dates as 
(
    select date = @fromdate 
    union all 
    select date = dateadd(day, 1, date) 
    from dates 
    where date < @tilldate 
) 
select * 
from dates 
where datename(weekday, date) = 'Sunday' 
2

首先,通過使用Tally Table生成日期從@fromDate@tillDate的列表,然後通過使用DATENAME得到星期日:

DECLARE @fromDate DATE = '20160301', 
     @tillDate DATE = '20160331' 

;WITH E1(N) AS(
    SELECT * FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t(N) 
), 
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), 
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), 
CteTally(N) AS(
    SELECT TOP (DATEDIFF(DAY, @fromDate, @tillDate) + 1) 
     ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
    FROM E4 
) 
SELECT 
    dt = DATEADD(DAY, N - 1, @fromDate) 
FROM CteTally 
WHERE (DATEPART(dw, DATEADD(DAY, N - 1, @fromDate)) + @@DATEFIRST) % 7 = 1 

SQL Fiddle


(DATEPART(dw, DATEADD(DAY, N - 1, @fromDate)) + @@DATEFIRST) % 7 = 1 

確定生成的日期是否爲星期天,而不考慮語言和@@DATEFIRST設置。

+0

+1爲語言和@@ datefirst獨立方法。 Sun是%7 = 1,Mon是%7 = 2,... Sat是%7 = 0 – Squirrel