今天是母亲节,它是在每一年的五月份的第二个星期天,而父亲节,是在每一个的六月份的第三个星期天。
把星期天设置为每周的开始,将一周的第一天设置为从 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
下面代码年份,看看得到的日期是否正确: