求指定日期范围内有几个星期几

    技术2022-05-20  47

    if exists(select * from dbo.sysobjects where id=object_id(N'[dbo].[FUN_GetWeekDays]') and xtype in (N'FN',N'IF',N'TF')) drop function [dbo].[FUN_GetWeekDays] go /* ********************************************************************************* Program ID: FUN_GetWeekDays Purpose : 求指定日期范围内有几个星期几 Author : Jesse Date : 2012.04.05 ********************************************************************************* */ Create Function dbo.FUN_GetWeekDays( @DateS smalldatetime, @DateE smalldatetime ) Returns @WeekDays Table([开始日期] smalldatetime,[结束日期] smalldatetime, [星期日] int ,[星期一] int , [星期二] int ,[星期三] int , [星期四] int ,[星期五] int ,[星期六] int ) As Begin declare @Count int, --返回结果,即周日的天数 @nWeekValue int, --起始日期是星期几(1-周日、2-周二...7-周六) @nDays int, --时间段内的天数 @nBeforeDays_Sun int, --起始日期到第一个周日的天数 @nBeforeDays_Mon int, --起始日期到第一个周一的天数 @nBeforeDays_Tue int, --起始日期到第一个周二的天数 @nBeforeDays_Wen int, --起始日期到第一个周三的天数 @nBeforeDays_Thu int, --起始日期到第一个周四的天数 @nBeforeDays_Fri int, --起始日期到第一个周五的天数 @nBeforeDays_Sat int, --起始日期到第一个周六的天数 @tmpDate smalldatetime --如果起始日期大于终止日期,则对换 if @DateS>@DateE select @tmpDate=@DateE,@DateE=@DateS,@DateS=@tmpDate --取得时间段内的天数 select @nDays=Datediff(d,@DateS,@DateE)+1 --取得起始日期的星期数,与设置无关(1-周日、2-周一...7-周六) select @nWeekValue=(datepart(dw,@DateS)+@@Datefirst)%7 if @nWeekValue=0 set @nWeekValue=7 --起始日期到第一次相符日期的天数 select @nBeforeDays_Sun=case when @nWeekValue<=1 then 1-@nWeekValue else 7-abs(1-@nWeekValue) end select @nBeforeDays_Mon=case when @nWeekValue<=2 then 2-@nWeekValue else 7-abs(2-@nWeekValue) end select @nBeforeDays_Tue=case when @nWeekValue<=3 then 3-@nWeekValue else 7-abs(3-@nWeekValue) end select @nBeforeDays_Wen=case when @nWeekValue<=4 then 4-@nWeekValue else 7-abs(4-@nWeekValue) end select @nBeforeDays_Thu=case when @nWeekValue<=5 then 5-@nWeekValue else 7-abs(5-@nWeekValue) end select @nBeforeDays_Fri=case when @nWeekValue<=6 then 6-@nWeekValue else 7-abs(6-@nWeekValue) end select @nBeforeDays_Sat=case when @nWeekValue<=7 then 7-@nWeekValue else 7-abs(7-@nWeekValue) end insert into @WeekDays([开始日期],[结束日期],[星期日],[星期一],[星期二],[星期三],[星期四],[星期五],[星期六]) select fDateS=@DateS,fDateE=@DateE, fSunDays=case when @nDays<@nBeforeDays_Sun then 0 else ceiling((@nDays-@nBeforeDays_Sun)/7.0) end, fMonDays=case when @nDays<@nBeforeDays_Mon then 0 else ceiling((@nDays-@nBeforeDays_Mon)/7.0) end, fTueDays=case when @nDays<@nBeforeDays_Tue then 0 else ceiling((@nDays-@nBeforeDays_Tue)/7.0) end, fWenDays=case when @nDays<@nBeforeDays_Wen then 0 else ceiling((@nDays-@nBeforeDays_Wen)/7.0) end, fThuDays=case when @nDays<@nBeforeDays_Thu then 0 else ceiling((@nDays-@nBeforeDays_Thu)/7.0) end, fFriDays=case when @nDays<@nBeforeDays_Fri then 0 else ceiling((@nDays-@nBeforeDays_Fri)/7.0) end, fSatDays=case when @nDays<@nBeforeDays_Sat then 0 else ceiling((@nDays-@nBeforeDays_Sat)/7.0) end return end /* --select @@datefirst select * from dbo.FUN_GetWeekDays('2012-01-01','2012-12-31') */ if exists(select * from dbo.sysobjects where id=object_id(N'[dbo].[FUN_GetDaysOfWeeks]') and xtype in (N'FN',N'IF',N'TF')) drop function [dbo].[FUN_GetDaysOfWeeks] go /* ********************************************************************************* Program ID: FUN_GetDaysOfWeeks Purpose : 求某段时间内某一星期日期的天数 Author : Jesse Date : 2012.04.05 ********************************************************************************* */ Create Function dbo.FUN_GetDaysOfWeeks( @DateS smalldatetime, @DateE smalldatetime, @WeekValue int) --星期的某一天:1-周日、2-周一...7-周六 Returns int As Begin declare @nCount int, --返回结果 @nWeekValue int, --起始日期是星期几(1-周日、2-周一...7-周六) @nDays int, --时间段内的天数 @nBeforeDays int, --起始日期到第一次相符日期的天数 @tmpDate smalldatetime --如果起始日期大于终止日期,则对换 if @DateS>@DateE select @tmpDate=@DateE,@DateE=@DateS,@DateS=@tmpDate --取得起始日期的星期数,与设置无关(1-周日、2-周一...7-周六) select @nWeekValue=(datepart(dw,@DateS)+@@Datefirst)%7 if @nWeekValue=0 set @nWeekValue=7 if @WeekValue>=@nWeekValue set @nBeforeDays=@WeekValue-@nWeekValue else set @nBeforeDays=7-abs(@WeekValue-@nWeekValue) --取得时间段内的天数 select @nDays=Datediff(d,@DateS,@DateE)+1 if @nDays<@nBeforeDays select @nCount=0 else select @nCount=ceiling((@nDays-@nBeforeDays)/7.0) Return @nCount end /* --select @@datefirst select dbo.FUN_GetDaysOfWeeks('2011-03-01','2011-05-31',7) */ if exists(select * from dbo.sysobjects where id=object_id(N'[dbo].[FUN_GetDaysOfWeek_Desc]') and xtype in (N'FN',N'IF',N'TF')) drop function [dbo].[FUN_GetDaysOfWeek_Desc] go /* ********************************************************************************* Program ID: FUN_GetDaysOfWeek_Desc Purpose : 求某段时间内某一星期日期的天数(字符描述) Author : Jesse Date : 2012.04.05 ********************************************************************************* */ Create Function dbo.FUN_GetDaysOfWeek_Desc( @DateS smalldatetime, @DateE smalldatetime, @WeekValue int) --星期的某一天:1-周日、2-周一...7-周六 Returns nvarchar(100) As Begin declare @sResult nvarchar(100), --结果描述 @nCount int, --返回结果 @nWeekValue int, --起始日期是星期几(1-周日、2-周一...7-周六) @nDays int, --时间段内的天数 @nBeforeDays int, --起始日期到第一次相符日期的天数 @sWeekName varchar(20), --所求日期的星期名称 @tmpDate smalldatetime --如果起始日期大于终止日期,则对换 if @DateS>@DateE select @tmpDate=@DateE,@DateE=@DateS,@DateS=@tmpDate --取得起始日期的星期数,与设置无关(1-周日、2-周一...7-周六) select @nWeekValue=(datepart(dw,@DateS)+@@Datefirst)%7 if @nWeekValue=0 set @nWeekValue=7 set @sWeekName=DateName(dw,DateAdd(d,@WeekValue-@nWeekValue,@DateS)) if @WeekValue>=@nWeekValue set @nBeforeDays=@WeekValue-@nWeekValue else set @nBeforeDays=7-abs(@WeekValue-@nWeekValue) --取得时间段内的天数 select @nDays=Datediff(d,@DateS,@DateE)+1 if @nDays<@nBeforeDays select @nCount=0 else select @nCount=ceiling((@nDays-@nBeforeDays)/7.0) set @sResult=N'日期区间:'+ convert(varchar(10),@DateS,120)+ N' 到 ' +convert(varchar(10),@DateE,120) +' 之间 ' +@sWeekName +N' 共有 '+cast(@nCount as varchar(100))+N' 天' Return @sResult end /* --select @@datefirst select dbo.FUN_GetDaysOfWeek_Desc('2012-01-01','2012-12-31',1) */

    最新回复(0)