我试图在不使用循环的情况下找到两个日期之间(包括两个日期(的所有周六。
例如,2021年4月1日至2021年5月1日应返回:
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';
这首先通过利用几个可能的系统表中的一个来仅选择一个row number
来在内部查询中生成一个数字列表。这本质上是在动态构建一个数字/计数表,通常最好有一个这样的永久表(从1开始到小数点或任何你需要的整数的单列(。您可以通过突出显示内部查询并运行它(SSMS中的F5
(来了解这是如何工作的。
out查询从中进行选择,并将行号筛选到两个指定日期之间天数的正确顺序范围。同样,您可以通过高亮显示除最后一行之外的整个查询来检查这一点,您会看到它生成了指定开始日期和结束日期之间的日期列表。
最后,and
标准提取每个日期的日期名称,并根据日期名称进一步过滤日期列表。