[英]Get Week from a date range SQL Server
Hello can someone tell me how to get the week no according to the given date range (Not week number by year or month) but the date range. 您好,有人可以告诉我如何根据给定的日期范围(不是按年或月的周数)而是日期范围来获取星期几。
Eg : From Date : '6/26/2017' and To Date: '7/23/2017'
Results 结果
Week 1 - (6/26/2017 - 7/2/2017)
Week 2 - (7/3/2017 - 7/10/2017)
Week 3 - (7/11/2017 - 7/18/2017)
Week 4 - (7/19/2017 - 7/23/2017)
If you are open to a TVF (Table-Valued Function) 如果您愿意接受TVF(表值函数)
I'll often use a udf to create dynamic date/time ranges. 我将经常使用udf创建动态日期/时间范围。 It is faster than a recursive CTE and is parameter driven.
它比递归CTE更快,并且受参数驱动。 You supply the Date/Time range, DatePart, and Increment.
您提供日期/时间范围,DatePart和增量。
Example 例
Select WeekNbr = 'Week '+cast(RetSeq as varchar(10))
,WeekBeg = cast(RetVal as date)
,WeekEnd = cast(RetVal+6 as date)
From [dbo].[udf-Range-Date]('2017-06-26','2017-07-23','WK',1)
Returns 退货
WeekNbr WeekBeg WeekEnd
Week 1 2017-06-26 2017-07-02
Week 2 2017-07-03 2017-07-09
Week 3 2017-07-10 2017-07-16
Week 4 2017-07-17 2017-07-23
The UDF if Interested UDF(如果有兴趣)
CREATE FUNCTION [dbo].[udf-Range-Date] (@R1 datetime,@R2 datetime,@Part varchar(10),@Incr int)
Returns Table
Return (
with cte0(M) As (Select 1+Case @Part When 'YY' then DateDiff(YY,@R1,@R2)/@Incr When 'QQ' then DateDiff(QQ,@R1,@R2)/@Incr When 'MM' then DateDiff(MM,@R1,@R2)/@Incr When 'WK' then DateDiff(WK,@R1,@R2)/@Incr When 'DD' then DateDiff(DD,@R1,@R2)/@Incr When 'HH' then DateDiff(HH,@R1,@R2)/@Incr When 'MI' then DateDiff(MI,@R1,@R2)/@Incr When 'SS' then DateDiff(SS,@R1,@R2)/@Incr End),
cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cte2(N) As (Select Top (Select M from cte0) Row_Number() over (Order By (Select NULL)) From cte1 a, cte1 b, cte1 c, cte1 d, cte1 e, cte1 f, cte1 g, cte1 h ),
cte3(N,D) As (Select 0,@R1 Union All Select N,Case @Part When 'YY' then DateAdd(YY, N*@Incr, @R1) When 'QQ' then DateAdd(QQ, N*@Incr, @R1) When 'MM' then DateAdd(MM, N*@Incr, @R1) When 'WK' then DateAdd(WK, N*@Incr, @R1) When 'DD' then DateAdd(DD, N*@Incr, @R1) When 'HH' then DateAdd(HH, N*@Incr, @R1) When 'MI' then DateAdd(MI, N*@Incr, @R1) When 'SS' then DateAdd(SS, N*@Incr, @R1) End From cte2 )
Select RetSeq = N+1
,RetVal = D
From cte3,cte0
Where D<=@R2
)
/*
Max 100 million observations -- Date Parts YY QQ MM WK DD HH MI SS
Syntax:
Select * from [dbo].[udf-Range-Date]('2016-10-01','2020-10-01','YY',1)
Select * from [dbo].[udf-Range-Date]('2016-01-01','2017-01-01','MM',1)
*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.