SQL获取两个日期之间的所有星期六
Posted
技术标签:
【中文标题】SQL获取两个日期之间的所有星期六【英文标题】:SQL Get all Saturdays between two Dates 【发布时间】:2021-04-25 19:56:25 【问题描述】:我试图在不使用循环的情况下查找两个日期(包括)之间的所有星期六。
例如,2021 年 4 月 1 日到 2021 年 5 月 1 日应该返回:
04-03-2021
04-10-2021
04-17-2021
04-24-2021
05-01-2021
【问题讨论】:
请标记您正在使用的数据库。 已编辑但其 SSMS SSMS是GUI,想必你用的是Sql Server 【参考方案1】:您可以使用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
。这实际上是在动态构建 numbers / tally 表,通常最好有一个这样的永久表可用(从 1 开始到 squintillion 或无论你需要什么)。您可以通过突出显示内部查询并运行它(SSMS 中的F5
)来了解其工作原理。
out 查询从中进行选择,并将行号过滤到恰好两个指定日期之间的天数的正确顺序范围。同样,您可以通过突出显示除最后一行之外的整个查询来检查这一点,您会看到它生成了包含指定开始日期和结束日期之间的日期列表。
最后,and
条件提取每个日期的日期名称,并根据日期名称进一步过滤日期列表。
【讨论】:
哦,在发布我的答案之前我没有看到您的编辑。我会删除我的。 @Pierre-AlainVigeant Lolz - 我认为最好同时提供两者,因为目前还不清楚预期的用例是什么。你说得对,使用数字表很有用,我在每个数据库中都有一个用于许多类似用途。 您好,感谢您的快速回复!我对此进行了测试,它可以工作,但是...您能解释一下它的作用吗?我可以理解其中的一部分,但不能全部理解 @userone 哪个部分 - 第一个查询或第二个 - 是问题,具体是什么? 第二个查询,坦率地说,除了最后一行(我假设是周六过滤)之外,我只能猜测以上是关于SQL获取两个日期之间的所有星期六的主要内容,如果未能解决你的问题,请参考以下文章