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不一定代表星期六,日。