SQL 获取两个日期之间的所有星期六

SQL Get all Saturdays between two Dates

我试图在不使用循环的情况下查找两个日期(含)之间的所有星期六。

例如,2021 年 4 月 1 日至 2021 年 5 月 1 日应return:

04-03-2021
04-10-2021
04-17-2021
04-24-2021
05-01-2021

您可以使用datename

    select *
    from Table
    where Datename(dw,Datecolumn)='Saturday'
    and DateColumn >= start and Datecolumn < End;

或者,如果您只想即时生成一个列表,您可以这样做

declare @StartDate date = '20210401', @EndDate date = '20210501';

select DateAdd(day, rn-1, @StartDate)
from ( 
    select Row_Number() over (order by object_id) rn
    from sys.columns
 ) d
where rn - 1 <= DateDiff(day, @StartDate, @EndDate)
and DateName(dw, DateAdd(day, rn-1, @StartDate))='Saturday';

这首先通过利用几个可能的系统 table 到 select 中的一个 row number 在内部查询中生成一个数字列表。这实际上是在动态构建一个 numbers / tally table,通常最好有一个永久的 table 像这样可用(单列从 1 开始到 squintillion 或任何你需要的整数)。您可以通过突出显示内部查询并 运行 它(SSMS 中的 F5)来了解它是如何工作的。

从此查询 selects 并将行号过滤到两个指定日期之间的天数的正确顺序范围。同样,您可以通过突出显示除最后一行之外的整个查询来检查这一点,您会看到它生成了指定开始日期和结束日期之间的日期列表。

最后,and 条件提取每个日期的日期名称,并根据日期名称进一步过滤日期列表。