我有以下要求(SQL Server):
我需要将所有员工休假请求(仅限假期)存储在表中。我还需要知道该期间(员工加入日期年份期间)还剩多少天(
vacations
)。
员工可以提前要求下一个周期的天用于实际周期。
这是它如何工作的示意图:
每个休假期是从员工入职之日起加一年。
如果我们看到时期2011-2012:
如果我们看到时期2012-2013:
现在,如果我们看到时期 2013-2014:
我实际的
employee_holiday
和 employee_holiday_item
表是:
employee_holiday
表将容纳所有假期请求employee_holiday_item
表将存储非连续天数,以防员工在同一假期请求中要求非连续天数。employee_holiday
将保留所有假期请求
我想知道是否建议其他表格来实现我的需要。
我认为没有必要为每个时期创建一个
employee_holiday_period
表,因为休假请求的所有信息都已经在 employee_holiday
表中,并且我已经从我的 employee
表中知道加入日期。
对我来说,你的employee_holiday表似乎更像是一个日志表。如果您不介意,我将使用不同的名称,我认为这些名称不仅适用于假期。
您将有一个名为
employee_ leaveTime
的表,用于存储休假类型和剩余天数。然后在 employee_leaveTime_log
(您将其命名为 employee_holiday
)中,您可以记录员工的请假请求(无论是休假、病假等)以及您想要跟踪的任何其他数据。然后,从另一个表中该特定休假类型的剩余天数中减去。这样你就可以更好地增加时间。
我认为有了这个,您不仅可以在假期时使用它
根据我的理解,我创建了以下脚本。 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