我有一个TSQL函数,我认为(我的SQL语法不强)会在调用时删除周末:
ALTER FUNCTION dbo.fn_WorkDays (@StartDate AS DATETIME, @EndDate AS DATETIME)
--Define the output data type.
RETURNS INT
AS
--Calculate the RETURN of the function.
BEGIN
RETURN (
SELECT
(DATEDIFF(dd,@StartDate, @EndDate)+1)--Start with total number of days including weekends +1 Includes the day run
-(DATEDIFF(wk,@StartDate, @EndDate)*2)--Subtact 2 days for each full weekend
-(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' --If StartDate is a Sunday, Subtract 1
THEN 1
ELSE 0
END)
-(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday'--If EndDate is a Saturday, Subtract 1
THEN 1
ELSE 0
END))
END
但我还想带走任何现有的银行假期,我可以使用类似的代码从表中获取:
SELECT COUNT([Date])
FROM [InvoiceManagement].[dbo].[tblBankHolidays]
WHERE [Date] BETWEEN '2006-04-14' AND '2006-05-29'--eventually replace dates with @StartDate, @EndDate
是否可以将上述选择拼接到函数中,以便在返回INT之前从结果中减去任何现有的银行?如果是这样,我将非常感谢我如何在TSQL中表现出色
2 回答
SQL Server 2008:
首先,我会使用一个表来度假,我会插入 all holidays (#Saturdays & Sundays) :
然后,为了获得两个日期之间的工作日,我会使用此查询:
注意:
DATENAME
不确定:结果:
Edit 1:
我相信我找到了另一种可行的解决方案;一个比上面更简单的解决方案(对我而言);我认为以上内容对我来说有点难以阅读并理解对不起@Bogdan . 这是使用该函数的脚本,并且当我针对日历检查它们时,似乎显示正确的结果:
这是被调用的函数脚本:
如果确实不正确,我可能会去检查并编辑代码 .