返回在指定日期内有几个指定的星期数

GO
if exists (select null from sysobjects where [name] = 'fn_get_weekday_num')
     drop function fn_get_weekday_num
GO
/*===================================================================================================
功能: 返回在指定日期内有几个指定的星期数  
       ( 如: 计算出在 2006-07-01 --> 2006-07-31 之间有几个 星期日 )

参数说明:
         @strat_date   日期范围的开始日期 
         @end_date     日期范围的结束日期
         @weekday      星期数 (范围:1-7 )
                            1   =    星期一  
                            2   =    星期二  
                            3   =    星期三  
                            4   =    星期四  
                            5   =    星期五  
                            6   =    星期六  
                            7   =    星期日
例: 
     select dbo.fn_get_weekday_num ('2006-07-01','2006-07-31',7) 
===================================================================================================*/
create function dbo.fn_get_weekday_num(@strat_date datetime   ,@end_date datetime   , @weekday int)
returns int
as 
begin
     ------------------------------------------------------------------------------------------------
     /*定义变量*/
     declare @return_value   int 
     declare @start_weekday int ,@end_weekday int
     ------------------------------------------------------------------------------------------------
     /*根据系统 DATEFIRST 计算出星期*/
     set @weekday =   case when @weekday >= @@datefirst   then @weekday- @@datefirst+1
                       else @weekday + 8 - @@datefirst end

     /*计算出开始日期与结束日期分别为星期几*/
     set @start_weekday = datepart(weekday,@strat_date)
     set @end_weekday    = datepart(weekday,@end_date)

     ------------------------------------------------------------------------------------------------
     /*计算时间范围内有几个指定的星期数*/    
     select   @return_value=   datediff(day , @strat_date,@end_date)/7
             +case when @start_weekday > @end_weekday 
                   then case when (@weekday <= 7   and   @weekday >= @start_weekday)
                                   or ( @weekday >= 1 and   @weekday <= @end_weekday)
                             then 1 else 0 end
              else case when      ( @weekday >= @start_weekday  
                                  and   @weekday <= @end_weekday)            
                  then 1 else 0 end
             end
     ------------------------------------------------------------------------------------------------
     /*返回值*/
     return @return_value
end
GO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值