首先道歉 - 我知道这个主题有很多线索,但我无法找到问题的答案。
我有一个UDF来计算两个日期之间的工作日。我正在使用SQL Server 2008。
CREATE FUNCTION dbo.fn_CountWeekDays
(
@fromdate Datetime,
@todate Datetime
)
RETURNS TABLE AS RETURN
(
SELECT
(DATEDIFF(dd, @fromdate, @todate) + 1)
-(DATEDIFF(wk, @fromdate, @todate) * 2)
-(CASE WHEN DATENAME(dw, @fromdate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @todate) = 'Saturday' THEN 1 ELSE 0 END)
As NoOfWeekDays
)
我试图在select语句中与另一个表一起调用它:
select dbo.fn_CountWeekDays(a.date1,a.date2) as workdays
from alex_datetest a
但是我收到了错误:
找不到任何一列" dbo"或用户定义的函数或聚合" dbo.fn_CountWeekDays",或名称不明确。
如果我放弃dbo。然后我明白了:
' fn_CountWeekDays'不是公认的功能名称。
有没有人有任何想法我为什么不能参考这个功能?
提前致谢
亚历
答案 0 :(得分:1)
正如我在评论中所做的那样,将您的功能改为:
CREATE FUNCTION dbo.fn_CountWeekDays
(
@fromdate Datetime,
@todate Datetime
)
RETURNS int
AS
BEGIN DECLARE @int int
SET @int =
(DATEDIFF(dd, @fromdate, @todate) + 1)
-(DATEDIFF(wk, @fromdate, @todate) * 2)
-(CASE WHEN DATENAME(dw, @fromdate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @todate) = 'Saturday' THEN 1 ELSE 0 END);
RETURN @int
END
答案 1 :(得分:0)
您有一个表值函数,因此您想使用apply
:
select cwd.*
from alex_datetest a cross apply
dbo.fn_CountWeekDays(a.date1,a.date2) cwd
如果要为列命名:
select cwd.workdays
from alex_datetest a cross apply
dbo.fn_CountWeekDays(a.date1,a.date2) cwd(workdays)
答案 2 :(得分:0)
由于它是返回表格,您可能需要使用交叉申请,如下所示:
Select * from yourtable a
cross apply dbo.fn_CountWeekDays(a.date1,a.date2) f