0

非数据库程序员在这里。它发生了,我需要在 T-SQL 中创建一个函数,它返回给定日期之间的工作日计数。我相信最简单的方法是使用while循环。问题是,一旦我写了类似的东西

while @date < @endDate
begin

end

该语句不会执行,声称“关键字'return'附近的语法不正确”(不是很有帮助)。问题出在哪里?

PS 完整代码:

ALTER FUNCTION [dbo].[GetNormalWorkdaysCount] (
@startDate DATETIME,
@endDate DATETIME
)   
RETURNS INT

AS
BEGIN
    declare @Count INT,
            @CurrDate DATETIME
    set @CurrDate = @startDate

    while (@CurrDate < @endDate)
    begin

    end

    return @Count
END
GO
4

2 回答 2

5

与某些语言不同,SQL Server 中的BEGIN/END对不能为空 - 它们必须至少包含一个语句。


至于您的实际问题-您说过您不是数据库程序员。大多数 SQL 初学者都倾向于走同样的路——尝试编写过程代码来解决问题。

然而,SQL 是一种基于集合的语言——通常最好找到基于集合的解决方案,而不是使用循环。

在这种情况下,日历表将是一个真正的帮助。这样的表格包含每个日期的一行,以及指示对您的业务有用的信息的附加列(例如,您认为是工作日)。然后,它使您对工作日的查询如下所示:

SELECT COUNT(*) from Calendar
where BaseDate >= @StartDate and BaseDate < @EndDate and IsWorkingDay = 1

填充日历表成为一次性练习,您可以轻松地用例如 30 年的日期填充它。

于 2012-10-08T07:06:52.540 回答
3

在 SQL Server 中使用任何循环都不是一个好主意 :)

很少有更好的解决方案,参考 StackOverflow 上已经提出的解决方案。

于 2012-10-08T07:14:16.657 回答