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
条件提取每个日期的日期名称,并根据日期名称进一步过滤日期列表。
我试图在不使用循环的情况下查找两个日期(含)之间的所有星期六。
例如,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
条件提取每个日期的日期名称,并根据日期名称进一步过滤日期列表。