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



我试图在不使用循环的情况下找到两个日期之间(包括两个日期(的所有周六。

例如,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标准提取每个日期的日期名称,并根据日期名称进一步过滤日期列表。

最新更新