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)
*/