Week Function

 今天是母亲节,它是在每一年的五月份的第二个星期天,而父亲节,是在每一个的六月份的第三个星期天。

把星期天设置为每周的开始,将一周的第一天设置为从 1 到 7 的一个数字。

set datefirst 7;  

参考msdn:然后,我们需要写一个自定义函,获取一年之中所有周别数据:

《week function》

 或者拷贝下面代码即可(稍有修改):

set ansi_nulls on
go

set quoted_identifier on
go

create function [dbo].[svf_week]
(
    @startyear int,
    @endyear int
)
returns @week table([id] int identity(1,1) primary key,[year] [int] null,[week] [int] null,[startdate] [datetime] null,[enddate] [datetime] null)
as
begin
    declare @startdateofyear datetime 
    declare @lastdateofyear datetime 
    declare @weekstartdate datetime 
    declare @weekenddate datetime 
    declare @weeks int 

    while @startyear <= @endyear
    begin
        set @startdateofyear = cast((cast(@startyear as varchar(4)) + '-01-01') as datetime)
        set @lastdateofyear= cast((cast(@startyear as varchar(4))+ '-12-31') as datetime)
        set @weeks = 1         
        
        declare @weekstartdateofyear datetime
        if datepart(dw,@startdateofyear) > 4
            set @weekstartdateofyear = dateadd(day,(8 - datepart(dw,@startdateofyear)) ,@startdateofyear)
        else 
            set @weekstartdateofyear = dateadd(day,(-(datepart(dw,@startdateofyear)-1)),@startdateofyear)

        set @weekstartdate = @weekstartdateofyear
        set @weekenddate = dateadd(day,6,@weekstartdate)
        while datediff(day,@weekstartdate,@lastdateofyear) >= 4
        begin
            insert into @week([year],[week],[startdate],[enddate]) values (@startyear,@weeks,@weekstartdate,@weekenddate)
            set @weeks = @weeks + 1
            set @weekstartdate = @weekstartdate + 7
            set @weekenddate = @weekenddate + 7
        end
        set @startyear = @startyear + 1
    end  
        return
end
go

 
把这个要求,写成一个自定义函数,方便用在程序应用即可。

 

set ansi_nulls on
go
set quoted_identifier on
go
-- =============================================
-- author:      insus.net
-- create date: 2019-05-12
-- update date: 2019-05-12
-- description: 获取母亲节或父亲节日期
-- =============================================
create function [dbo].[svf_parents_festival]
(
    @startyear int,
    @endyear int
)
returns @temptable table([id] int identity(1,1) primary key,[year] [int] not null,[mother's day] [datetime] null,[father's day] [datetime] null)
as
begin       
    declare @weeks as table([year] int,[startdateofweek] datetime)
    insert into @weeks ([year],[startdateofweek]) select [year],[startdate] from [dbo].[svf_week] (@startyear,@endyear)
    
    while @startyear <= @endyear
    begin
        insert into @temptable ([year]) values(@startyear)      

        update @temptable set [mother's day] = (
            select [startdateofweek] from (
                select row_number() over (order by [startdateofweek] asc) as [rownumber], [startdateofweek] from @weeks 
                where [year] = @startyear and month([startdateofweek]) = 5) as m 
            where [rownumber] = 2)
        where [year] = @startyear

        update @temptable set [father's day] = (
            select [startdateofweek] from (
                select row_number() over (order by [startdateofweek] asc) as [rownumber], [startdateofweek] from @weeks 
                where [year] = @startyear and month([startdateofweek]) = 6) as f 
            where [rownumber] = 3)
        where [year] = @startyear

        set @startyear = @startyear + 1
    end  

    return
end

 

下面代码年份,看看得到的日期是否正确:

 

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐