日期:2014-05-17  浏览次数:20417 次

sql需求高效率的求工作日,除去周六日,要高效率
 ----此方法排除
create function [dbo].[fn_test]
(
@begin datetime --开始时间
,@end datetime  --结束时间

returns int       --返回工作日天数
As 
BEGIN 
declare @i int,@j int 
set @i=0 
set @j=0 
if @end> @begin   --如果结束时间大于开始时间
begin 
while dateadd(d,@i,@begin) <=@end    --当在开始时间增加天数仍然小于结束时间
begin    
if datepart(weekday,dateadd(d,@i,@begin)) not in(1,7) --当开始时间不在周日、周六时
begin
set @j=@j+1 
set @i=@i+1 
end
end 
end 
return @j 
END 




 
sql

------解决方案--------------------

create function [dbo].[fn_test]
(
@begin datetime --开始时间
,@end datetime  --结束时间

returns int       --返回工作日天数
As 
BEGIN 
declare @i int,@j int ,@a datetime
set @j=0 
if @end< @begin   --如果结束时间大于开始时间
begin 
set @a=@begin
set @begin=@end
set @end=@a    --当在开始时间增加天数仍然小于结束时间
end
set @j=(datediff(week,@begin,@end)-1)*5
      +(datepart(weekday,@end)-1)
      +(6-datepart(weekday,@begin))
return @j 
END 


这个也行
------解决方案--------------------
上面那注释忘删了
------解决方案--------------------
你的写法也不差呀。只是进入了死循环。
把set @i=@i+1 放到外面就可以,如下:
if datepart(weekday,dateadd(d,@i,@begin)) not in(1,7) --当开始时间不在周日、周六时
begin
set @j=@j+1 
END
set @i=@i+1 

另外,记得set datefirst
不然1,7不一定代表星期六,日。