@Mikael Eriksson有一个绝妙的主意,但是他的实现似乎有些复杂。
这是我想出的(我想强调一下, 它基于
@Mikael 的
解决方案 ,主要功劳应该
归于 该
解决方案 ):
ALTER FUNCTION dbo.f_countweekdays (@Dow int, @StartDate datetime, @EndDate datetime)RETURNS intAS BEGIN RETURN ( SELECT DATEDIFF(wk, @StartDate, @EndDate) - CASE WHEN DATEPART(dw, @StartDate) > @Dow THEN 1 ELSE 0 END - CASE WHEN DATEPART(dw, @EndDate) < @Dow THEN 1 ELSE 0 END + 1 )END
更新
正如Mikael在其答案的注释线程中正确指出的那样,为了使上述解决方案正确运行,必须将DATEFIRST设置设置为
7(Sunday)。尽管我找不到此文档,但快速测试发现它
DATEDIFF(wk)忽略了实际的DATEFIRST设置,实际上返回了以周为单位的差值,就好像DATEFIRST始终设置为7。同时
DATEPART(dw)尊重了
DATEFIRST,因此DATEFIRST设置为other值两个函数返回的结果不一致。
因此,必须修改上述脚本,以便在计算时考虑DATEFIRST设置的不同值
DATEDIFF(wk)。令人高兴的是,修复似乎并没有取得该解决方案 更
比以前复杂,在我看来。不过,请自行判断:
ALTER FUNCTION dbo.f_countweekdays (@Dow int, @StartDate datetime, @EndDate datetime)RETURNS intAS BEGIN RETURN ( SELECT DATEDIFF(wk, DATEADD(DAY, -@@DATEFIRST, @StartDate), DATEADD(DAY, -@@DATEFIRST, @EndDate)) - CASE WHEN DATEPART(dw, @StartDate) > @Dow THEN 1 ELSE 0 END - CASE WHEN DATEPART(dw, @EndDate) < @Dow THEN 1 ELSE 0 END + 1 )END
编辑: 这两个
-@@DATEFIRST % 7条目都简化为just
-@@DATEFIRST,正如有人在这里建议的那样。



