在T-SQL函数中使用while循环

Arn*_*hor 0 sql t-sql sql-server-2008

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

while @date < @endDate
begin

end
Run Code Online (Sandbox Code Playgroud)

声明将不会执行,声称"关键字'返回'附近的语法不正确"(不是很有用).哪里出了问题?

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
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

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


至于你的实际问题 - 你说过你不是一名DB程序员.SQL的大多数初学者倾向于沿着相同的路线走 - 试图编写程序代码来解决问题.

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

在这种情况下,日历表将是一个真正的帮助.这样的表包含每个日期的一行,以及表示您的业务有用信息的其他列(例如,您认为是工作日).然后,它使您的工作日查询看起来像:

SELECT COUNT(*) from Calendar
where BaseDate >= @StartDate and BaseDate < @EndDate and IsWorkingDay = 1
Run Code Online (Sandbox Code Playgroud)

填充日历表变为一次性练习,您可以轻松填充例如30年的日期.