【发布时间】:2014-04-09 07:57:38
【问题描述】:
我已经创建了一个存储过程,我需要它来检查日期范围内的每个日期。日期从浏览器(我的表单)传递,然后在存储过程中设置为变量。
当它在日期范围之间进行检查时,我还需要它来计算其他内容,例如,如果所选日期之间的日期中有 20 人,则我有一个为 20 的 @max_users 常量,将变量设置为 false。
这是迄今为止尝试在日期范围之间进行选择的代码。
SELECT (SOME FORM OF COUNTER TO COUNT VARIABLES WOUDL GO HERE)
FROM table
WHERE @Startdate => @StartDate AND =< @EndDate
我是 SQL 新手,遇到了麻烦。
CREATE PROCEDURE spBusinessRules (@Startdate date, @Enddate date, @EmployeeID int)
/*****
Name:spBusinessRules
Description: Checks the holiday agaisnt all the business rules ready for accepting or declining
*****/
AS
BEGIN
SELECT COUNT(*)
FROM Holidays
WHERE @Startdate >= @Startdate AND @Enddate <= @Enddate AND (SELECT jobrole FROM Employees WHERE ID = @EmployeeID) = JobRole
END
SELECT * FROM Employees
以上是我最近的尝试,但我仍然遇到问题
【问题讨论】:
-
您基本上是在考虑循环,而这不是 SQL 工作的一般方式(很好)。在 SQL 中,我们尝试编写一个处理整个数据集的查询。不幸的是,您的问题太模糊了,我无法提出实际的查询。如果您可以添加一些示例数据,然后对于
@StartDate和@EndDate的某些值,预期结果,我们可以尝试编写一个计算整个结果的查询 - 而不是依次遍历每个日期。跨度> -
嗯,
WHERE @Startdate >= @Startdate AND @Enddate <= @Enddate是两个非常真实的比较。您可能希望将表中的列(没有@)与参数值进行比较。此外,如果您尝试从holidays表中查找与@StartDate和@EndDate定义的范围以任何方式重叠 的行,那么您会遗漏很多边缘情况。查找重叠行的最佳方法是StartDate < @EndDate and @StartDate < EndDate。最后,如果你只是在寻找0或more than 0,那么使用EXISTS而不是COUNT。 -
我虽然 count 更合适,因为我试图计算其中的一定数量的值,因为如果它的计数超过 10,它会将 BIT 更改为 false,这仍然适用于存在跨度>
-
不,我只是在开枪,因为当您真正想知道是否存在任何行时,使用
COUNT()是一个常见的初学者错误。正如我所说,如果您可以添加一些示例数据和预期结果,我可能会提供帮助。目前,我们所拥有的只是您的尝试,虽然我可以发现一些明显的问题,但我仍然对您实际想要实现的目标了解不够。 -
基本上我有一个假期预订系统,这个过程检查规则,当它通过它们时,所有这些都将一个变量评估为 true 来预订假期。开始日期和结束日期是用户想要离开的日期,因此它需要检查他们之间是否还有 10 人离开日期(我认为无论如何)它还使用传递的员工 ID,因此它可以找到工作角色(让我们现在说那里是管理员)。然后如果有 10 个管理员关闭评估为 false 并且不让他们预订 :) 我有一大堆规则,但如果我能理解这个,我可能会完成剩下的