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