Sql 如何从作为参数传递的日期范围中提取星期日

Sql 如何从作为参数传递的日期范围中提取星期日,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我有两个变量作为参数传递给存储过程:@fromdate&@tilldate 我需要提取每个星期天的日期 我已经尝试了一段时间,但无法实现解决方案 任何帮助都将不胜感激首先,使用a生成从@fromDate到@tillDate的日期列表,然后使用DATENAME获取星期日: ; with dates as ( select date = @fromdate union all select date = dateadd(day, 1, date) from dat

我有两个变量作为参数传递给存储过程:@fromdate&@tilldate

我需要提取每个星期天的日期

我已经尝试了一段时间,但无法实现解决方案


任何帮助都将不胜感激

首先,使用a生成从@fromDate到@tillDate的日期列表,然后使用DATENAME获取星期日:

; 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'

确定生成的日期是否为周日,而不考虑语言和@@DATEFIRST设置。

首先,使用生成从@fromDate到@tillDate的日期列表,然后使用DATENAME获取周日:


确定生成的日期是否为周日,而不考虑语言和@DATEFIRST设置。

+1表示语言&@@DATEFIRST独立方法。Sun为%7=1,Mon为%7=2。。。语言&@@datefirst独立方法的Sat为%7=0+1。Sun为%7=1,Mon为%7=2。。。Sat为%7=0
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
(DATEPART(dw, DATEADD(DAY, N - 1, @fromDate)) + @@DATEFIRST) % 7 = 1