【问题标题】:Select Between dates and count variables在日期和计数变量之间选择
【发布时间】: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 &gt;= @Startdate AND @Enddate &lt;= @Enddate 是两个非常真实的比较。您可能希望将表中的列(没有@)与参数值进行比较。此外,如果您尝试从holidays 表中查找与@StartDate@EndDate 定义的范围以任何方式重叠 的行,那么您会遗漏很多边缘情况。查找重叠行的最佳方法是StartDate &lt; @EndDate and @StartDate &lt; EndDate。最后,如果你只是在寻找0more than 0,那么使用EXISTS 而不是COUNT
  • 我虽然 count 更合适,因为我试图计算其中的一定数量的值,因为如果它的计数超过 10,它会将 BIT 更改为 false,这仍然适用于存在跨度>
  • 不,我只是在开枪,因为当您真正想知道是否存在任何行时,使用COUNT() 是一个常见的初学者错误。正如我所说,如果您可以添加一些示例数据和预期结果,我可能会提供帮助。目前,我们所拥有的只是您的尝试,虽然我可以发现一些明显的问题,但我仍然对您实际想要实现的目标了解不够。
  • 基本上我有一个假期预订系统,这个过程检查规则,当它通过它们时,所有这些都将一个变量评估为 true 来预订假期。开始日期和结束日期是用户想要离开的日期,因此它需要检查他们之间是否还有 10 人离开日期(我认为无论如何)它还使用传递的员工 ID,因此它可以找到工作角色(让我们现在说那里是管理员)。然后如果有 10 个管理员关闭评估为 false 并且不让他们预订 :) 我有一大堆规则,但如果我能理解这个,我可能会完成剩下的

标签: sql date select count


【解决方案1】:

最好的方法是在 TSQL 中声明一个获取参数(日期)的函数。然后你可以在函数中进行计算,并将值返回给该语句以显示。

【讨论】:

  • 嗯,他正在尝试编写程序,所以这基本上什么也没告诉他。
【解决方案2】:

最后我设法做到了,这是工作成果

DECLARE @EmployeeID int
DECLARE @StartDate date
DECLARE @EndDate date
DECLARE @JobRoleID int

SET @JobRoleID = 2
SET @EmployeeID = 2010
SET @Startdate = '2013-03-13'
SET @EndDate = '2015-03-14'

/*Sets The max days off for the users jobrole*/
DECLARE @EmployeeJobroleMAX int
SET @EmployeeJobroleMAX = (SELECT maxusersOffPerDay 
                           FROM JobRole 
                           WHERE @JobRoleID = JobRole.ID)
DECLARE @JobRoleOff int

BEGIN
    DECLARE @DateCount date
    SET @DateCount = @Startdate

    DECLARE @EndDateCheck date
    SET @EndDateCheck = DATEADD(d, 1, @EndDate)

    WHILE(@DateCount <> @EndDateCheck)
        BEGIN

            SET @JobRoleOff = (SELECT COUNT(*) JobRoleID 
                               FROM Employees 
                               RIGHT JOIN Holidays 
                                       ON Employees.ID = Holidays.EmployeeID 
                               WHERE @EmployeeID = Employees.ID 
                                     AND Holidays.StartDate >= @StartDate 
                                     AND Holidays.EndDate <= @EndDate)
            SET @DateCount = DATEADD(d, 1, @DateCount)
        END

    IF(@JobRoleOff >= 1)
        BEGIN
            SELECT @JobRoleOff AS Failed
        END
END

【讨论】:

  • 嗯,如果我的缩进正确,那么您在循环时不会整天检查。有人可以检查我的工作吗?无论如何,这可能不是最好的选择 - 请问我们可以获取样本数据和所需的结果吗?
  • 你是对的。我现在意识到我没有正确测试,这不是完整的答案:(。这个 jsut 检查开始日期和结束日期。它不检查开始日期和结束日期之间
猜你喜欢
  • 2018-02-19
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多