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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值