非数据库程序员在这里。它发生了,我需要在T-SQL中创建一个函数,它返回给定日期之间的工作日计数。我认为最简单的方法是使用 while 循环。问题是,一旦我写了像
这样的东西while @date < @endDate
begin
end
该语句将不会执行,声称“关键字'返回'附近的语法不正确”(不是很有用)。问题出在哪里?
P.S。完整代码:
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
答案 0 :(得分:5)
与某些语言不同,SQL Server中的BEGIN
/END
对不能为空 - 它们必须包含至少一个语句。
至于你的实际问题 - 你说过你不是一名DB程序员。 SQL的大多数初学者倾向于沿着相同的路线 - 试图编写程序代码来解决问题。
然而,SQL是一种基于集合的语言 - 通常最好找到基于集合的解决方案,而不是使用循环。
在这种情况下,日历表将是一个真正的帮助。这样的表包含每个日期的一行,以及表示您的业务有用信息的其他列(例如您认为是工作日)。然后,它使您的工作日查询看起来像:
SELECT COUNT(*) from Calendar
where BaseDate >= @StartDate and BaseDate < @EndDate and IsWorkingDay = 1
填充日历表变为一次性练习,您可以使用例如填充它。 30年的约会很容易。
答案 1 :(得分:3)
在SQL服务器中使用任何循环绝不是一个好主意:)
有一些更好的解决方案,参考StackOverflow already上提供的解决方案。