简体   繁体   English

从日期范围获取星期SQL Server

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM