SQL如何存储员工假期请求和剩余天数

时间:2014-07-26 17:13:45

标签: c# sql sql-server sql-server-2008

我有以下要求( SQL SERVER ):

  

我需要将所有员工休假请求(仅限假期)存储在表格中

     

此外,我需要知道期间(员工加入日期年度)剩余多少天(vacations

     

员工可以在下一期间提前请求在实际期间内使用。

以下是它应该如何运作的示意图:

enter image description here

每个休假期均来自员工加入日期加一年。

  1. 第一个期间(当员工加入公司时)默认情况下他会有 4 个假期。
  2. 然后,每个期限的员工都会获得2天以上,最多18天。
  3. 如果我们看到期间 2011-2012

    1. 员工 5 假期使用
    2. 因为这是第一年,所以没有前一段时间没用。
    3. 他获得了4个休假日,他使用 4 天。
    4. 该期间的剩余天数为 1 天,这是累积的下一期间。
    5. 如果我们看到期间 2012-2013

      1. 员工现在有 7 个假期。
      2. 他在前一段时间内没有使用 1
      3. 他获得了10个休假日,他使用 10 天。
      4. 因为他距实际期间只有 7 天加上之前的 1 未使用的日期,所以他只有8天。但是,该公司让他从下一个时期“提前”休息。在这种情况下,他提前要求 2
      5. 该期间的剩余天数 0 天。
      6. 现在,如果我们看到期间 2013-2014

        1. 员工现在有 9 个假期。
        2. 他提前要求 -2 天。
        3. 他获得了6个休假日,他使用 6 天。
        4. 因为他从实际期间减去 9 天,减去前一天要求的 2 天,所以他只有7天。
        5. 此期间剩余的剩余天数为 1 天。
        6. 我的实际employee_holidayemployee_holiday_item表格是:

            

          • employee_holiday表将保留所有假期请求
          • employee_holiday_item表将存储非连续的天数,以防员工在同一个度假请求中请求非连续的几天。

          employee_holiday将保留所有假期请求

          enter image description here

            
              

          我想知道是否有人有类似这样的内容,为了达到我的需要,建议使用其他表格。

            

          我认为没有必要为每个时段创建一个employee_holiday_period表,因为来自休假请求的所有信息都已经在employee_holiday表中,我已经知道了employee }表连接日期。

          希望有人可以帮助我或指导这一点。欣赏它。

2 个答案:

答案 0 :(得分:0)

对我来说,您的employee_holiday表似乎更像是一个日志表。如果你不介意我会使用不同的名字,我认为这些名称不仅仅适用于休假。

你会有一个名为employee_ leaveTime的表,它会存储请假类型和剩余天数。然后在employee_leaveTime_log(您已将其命名为employee_holiday)中,您可以记录员工的请假(无论是度假,生病等)以及您想要跟踪的任何其他数据。然后从另一个表中的特定假期类型的剩余天数中减去。有了这个,你可以更好地增加时间。

我认为你可以用它来度过休假时间

答案 1 :(得分:0)

根据我的理解,我创建了以下脚本。 CTE部分将根据他在公司的服务计算员工的总休假。 “LeaveTaken”计算员工所有的叶子。最后,我采取了员工休假和休假的差额。如果这是一个负值,意味着员工已经提前休假,那么价值就是积极的。

将员工的ID传递给@UserID。您可能需要对代码进行一些更改,因此请在执行前仔细检查代码。

DECLARE @NoYearsOfService INT = 15; --DATEDIFF(Years,DateOfJoining,CurrentYear)
DECLARE @Leavetaken INT;

SELECT @Leavetaken = SUM(Leaves)
    FROM (
                SELECT SUM(DATEDIFF(DAYS,StartDate,EndDate)) L
                FROM employee_holiday
                WHERE UserID = @UserID

                UNION

                SELECT COUNT(*)
                FROM employee_holiday_item
         ) temp

;WITH CTE AS
(
    SELECT 4 Days,
           4 TotalLeaves,
           1 Years

    UNION ALL

    SELECT  Days + 2,
            CASE WHEN Days < 18 
                THEN TotalLeaves + Days + 2
                ELSE TotalLeaves + 18 END,
           Years + 1
    FROM CTE 
    WHERE Years < @NoYearsOfService
)

SELECT TotalLeaves - @Leavetaken
FROM CTE
WHERE Years = @NoYearsOfService