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

问题描述 投票:0回答:2

我有以下要求(SQL Server):

我需要将所有员工休假请求(仅限假期)存储在表中。我还需要知道该期间(员工加入日期年份期间)还剩多少天(

vacations
)。

员工可以提前要求下一个周期的天用于实际周期。

这是它如何工作的示意图:

enter image description here

每个休假期是从员工入职之日起加一年。

  1. 第一期(员工加入公司时)默认获得4假期。
  2. 然后,员工每经期可多获得 2 天,上限为 18 天。

如果我们看到时期2011-2012

  1. 员工有5假期可以使用
  2. 因为是第一年,所以没有之前期间未使用的天数。
  3. 他获得了 4 天的休假授权,所以他用了 4 天。
  4. 该期剩余天数为1天,下期累计。

如果我们看到时期2012-2013

  1. 该员工现在有 7 个假期可以使用。
  2. 他还有 1 天未使用上一周期。
  3. 他获得了 10 天的休假授权,所以他用了 10 天。
  4. 因为他距离实际经期只有 7 天,再加上前一天未使用的1 天,所以他只有 8 天。但是,公司让他从下一个周期“提前”几天。在这种情况下,他提前2天提出要求。
  5. 该期剩余天数为0天。

现在,如果我们看到时期 2013-2014

  1. 该员工现在有 9 个假期可以使用。
  2. 他需要提前 -2 天提出请求。
  3. 他获得了6天的假期授权,所以他用了6天。
  4. 因为他距离实际经期还有9天减去之前要求的2天,所以他只有7天。
  5. 该期还剩1天。

我实际的

employee_holiday
employee_holiday_item
表是:

  • employee_holiday
    表将容纳所有假期请求
  • employee_holiday_item
    表将存储非连续天数,以防员工在同一假期请求中要求非连续天数。

employee_holiday
将保留所有假期请求

enter image description here

我想知道是否建议其他表格来实现我的需要。

我认为没有必要为每个时期创建一个

employee_holiday_period
表,因为休假请求的所有信息都已经在
employee_holiday
表中,并且我已经从我的
employee
表中知道加入日期。

sql sql-server sql-server-2008
2个回答
0
投票

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

您将有一个名为

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

我认为有了这个,您不仅可以在假期时使用它


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
© www.soinside.com 2019 - 2024. All rights reserved.