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获取两个日期之间的所有星期六的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句计算两个日期之间有多少个工作日的方法

sql获取两个日期之间的每周开始日期

日期之间的差异sql-忽略星期六星期日

计算两个特定日期之间有多少个星期五(或任何一个)?

如何删除两个日期之间的星期六和星期日并计算总天数[重复]

如何从sql中的星期和日期中获取日期?