SQL问题,如何获取某月的所有周的日期范围【转语雀】

IF OBJECT_ID('ETLWORK_GETWEEKNUMBER','FN') IS NOT NULL
DROP FUNCTION ETLWORK_GETWEEKNUMBER
GO
 --传入日期计算周数
CREATE FUNCTION ETLWORK_GETWEEKNUMBER(@DATE DATETIME)  
RETURNS INTEGER
AS
BEGIN 

    DECLARE @FIRST_DATE_OF_YEAR DATETIME = DATEADD(YYYY,DATEDIFF(YYYY,0,@DATE),0) 
    -- DECLARE @MONDAY_OF_WEEK DATETIME = DATEADD(WK,DATEDIFF(WK,0,@DATE),0) 
    -- DECLARE @PREVIOUS_DATE DATETIME = DATEADD(DAY,-1,@DATE)
    DECLARE @WEEK_NUMBER INTEGER

    -- 如果当前时间是当前年的第一天
    IF @DATE = @FIRST_DATE_OF_YEAR
        SET @WEEK_NUMBER = 1 
    -- 星期天是年第一天的情况
    ELSE IF (DATEPART(WEEKDAY,@DATE) = 1 AND DATEDIFF(DAYOFYEAR,@FIRST_DATE_OF_YEAR,@DATE)/7 + 1 = DATEPART(WEEK,@DATE))  
        SET @WEEK_NUMBER = DATEPART(WEEK,@DATE)  
    -- 星期天不是年第一天的情况
    ELSE IF (DATEPART(WEEKDAY,@DATE) = 1 AND DATEDIFF(DAYOFYEAR,@FIRST_DATE_OF_YEAR,@DATE)/7 + 1 <> DATEPART(WEEK,@DATE)) 
        SET @WEEK_NUMBER = DATEPART(WEEK,@DATE) - 1 
    -- 如果当前天的上一个周日小于年第一天
    ELSE IF DATEADD(DAY,-1,DATEADD(WK,DATEDIFF(WK,0,@DATE),0)) < @FIRST_DATE_OF_YEAR 
        SET @WEEK_NUMBER = 1 
    -- 当前天前面的一个周日正好是以周日为开始年的 7 倍的天数
    ELSE IF DATEDIFF(DAYOFYEAR,@FIRST_DATE_OF_YEAR,DATEADD(DAY,-1,DATEADD(WK,DATEDIFF(WK,0,@DATE),0) ))/7 + 1 = DATEPART(WEEK,@DATE) 
        SET @WEEK_NUMBER = DATEPART(WEEK,@DATE) + 1  
    ELSE 
        SET @WEEK_NUMBER = DATEPART(WEEK,@DATE)   
           
    RETURN @WEEK_NUMBER
END
GO

2.传入日期得到周数和周的日期范围

CREATE FUNCTION [dbo].[fn_list_weeks_by_month]
(
    @curDate DATE
)
RETURNS
@tmpWeekRange TABLE 
(
    weekno INT,
    month INT,
    begindate DATE,
    enddate DATE
)
AS
BEGIN
    declare @monthFirstDate date,@monthLastDate date,@tmpdate date
    --取本月第一天
    set @monthFirstDate=DATEADD(DD,-DATEPART(day,@curDate)+1,@curDate)
    --取本月最后一天 
    set @monthLastDate=dateadd(dd,-DatePart(day,dateadd(MM,1,@curDate)),dateadd(MM,1,@curDate))
    set @tmpdate=@monthFirstDate 

    --当所在周超出当月时,函数结束
    while(dateadd(dd,-(DatePart(weekday, dateadd(dd,-1,@tmpdate))-1),@tmpdate)<=@monthLastDate)
    begin
        insert into @tmpWeekRange
        values(
        dbo.ETLWORK_GETWEEKNUMBER(@tmpdate)        --调自定义函数,获取星期一开始的周数
        ,MONTH(@tmpdate)
        ,dateadd(dd,-(DatePart(weekday, dateadd(dd,-1,@tmpdate))-1),@tmpdate)        --取周第一天
        ,dateadd(dd,(7-DatePart(weekday, dateadd(dd,-1,@tmpdate))),@tmpdate))        --取周最后一天
    
        --跳到下周
        set @tmpdate=DATEADD(DAY,7,@tmpdate)
    end

    RETURN 
END
GO
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值