Sql server 给定日期范围内的特定日期列表

Sql server 给定日期范围内的特定日期列表,sql-server,Sql Server,我在寻找给定日期范围内的特定日期列表,我发现了这个 declare @d datetime select @d = '20100101' --'20090101' if you want 2009 etc etc select dateadd(dd,number,@d) from master..spt_values where type = 'p' and year(dateadd(dd,number,@d))=year(@d) and DATEPART(dw,dateadd(dd,nu

我在寻找给定日期范围内的特定日期列表,我发现了这个

declare @d datetime
select @d = '20100101'  --'20090101'  if you want 2009 etc etc

select dateadd(dd,number,@d) from master..spt_values
where type = 'p'
and year(dateadd(dd,number,@d))=year(@d)
and DATEPART(dw,dateadd(dd,number,@d)) = 7

我想知道我是否可以用开始日期和结束日期来代替年份,并且可以得到两天的列表,比如周六和周日


关于

这将为您提供@start和@end之间每一天的天数:

declare @start date = '20151001', @end date = '20151017'
Select c = DATEDIFF(DAY, @start, @end)/ 7
     + case when (7 + DATEPART(WEEKDAY, @start) + (DATEDIFF(DAY, @start, @end)% 7) - d) % 7 <= (DATEDIFF(DAY, @start, @end)%7) then 1 else 0 end
From (values(1), (2), (3), (4), (5), (6), (7)) as days(d)
它完全避免在@start和@end之间的每一天使用递归CTE和DATEADD。这只是一些数学问题

对于多个日期,您也可以使用类似的方法,尽管在大范围内效率不高:

declare @start date = '20151001', @end date = '20151017'

Select DATEADD(DAY, n, @start), DATEPART(WEEKDAY, DATEADD(DAY, n, @start))
From (
    Select top(DATEDIFF(DAY, @start, @end)+1) ROW_NUMBER() over(order by n)-1
    From (
        Select 1 From (values(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) as v1(n)
        Cross Join (values(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) as v2(n)
        Cross Join (values(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) as v3(n)
    ) as v(n)
) as o(n)
Where DATEPART(WEEKDAY, DATEADD(DAY, n, @start)) in (7, 1)
输出:

Day 1   2
Day 2   2
Day 3   2
Day 4   2
Day 5   3
Day 6   3
Day 7   3
DATE        WEEKDAY
2015-10-03  7
2015-10-04  1
2015-10-10  7
2015-10-11  1
2015-10-17  7
这里,7=周六,1=周日。您可以添加1到7之间的任何值,也可以从另一个表中添加。 如果使用DATENAME,它可以被日期名称替换

然后,您只需添加一组和/或一个总和即可获得周六和周日的数量


V1/V2/V3避免使用递归查询,并快速生成从0到X,最多999的数字列表。X是@start和@end之间的差值,以天为单位。如果需要10.000天的范围,请添加v4,以此类推。。。但1000年就足够2年了,差不多3年了。

这是对rajeshmpanchal scrpit的一个小修改

为cte maxrecursion添加-默认为100行。 将日期设置为1/*星期一* 您可以尝试以下方法:

set datefirst 1 /* monday */

declare @v_date_start datetime
declare @v_date_stop datetime

set @v_date_start = '2015-05-01'
set @v_date_stop = '2020-10-01' 

;with date_cte 
as
(
    select  @v_date_start [date]
    union all
    select  dateadd(day, 1, cte.date) [date]        
    from    date_cte [cte]
    where   dateadd(day, 1, cte.date) <= @v_date_stop 

)

select  cte.date
    ,   datename(dw, cte.date) [day_name]
from    date_cte [cte]
where   datepart(dw, cte.date) in (6,7)
option  (maxrecursion 0)

递归选择从_date到_date的所有日期,然后使用DATEPART检查是否是周末

declare @from_date as date---your from date
declare @to_date as date---your to date

;WITH dates AS (
    SELECT CONVERT( DATE, @from_date) AS a
    UNION ALL
    SELECT DATEADD( DAY, 1, a )
    FROM   dates
    WHERE  DATEADD( DAY, 1, a ) <= @to_date --including the @to_date
)
SELECT a
FROM   dates
WHERE  DATEPART( dw, a ) IN ( 1, 7 ) --- Saturday Or Sunday
如果你只想在星期六检查

SELECT a
    FROM   dates
    WHERE  DATEPART( dw, a )=7

谢谢大家。问题解决了。问候和尊重。
SELECT a
    FROM   dates
    WHERE  DATEPART( dw, a )=7