У меня есть следующее требование (SQL SERVER):
Мне нужно сохранить все запросы на отпуск сотрудников (только каникулы) в таблице
Также мне нужно знать, сколько осталось дней (
vacations
) в период (период вступления в должность сотрудника)Сотрудник может запросить заблаговременные дни следующего периода, которые будут использоваться в фактический период.
Здесь схематично, как она должна работать:
Каждый период каникул - от даты присоединения к сотрудникам плюс один год.
Если мы увидим Период 2011 -2 012:
Если мы увидим Период 2012 -2 013:
Теперь, если мы увидим Период 2013 -2 014:
Мои фактические таблицы employee_holiday
и employee_holiday_item
:
employee_holiday
таблице employee_holiday
будут храниться все запросы на отпускemployee_holiday_item
таблице employee_holiday_item
будут храниться непрерывные дни в случае, если сотрудник в том же запросе на отпуск запросил несрочные дни.employee_holiday будет выполнять все праздничные запросы
Я хотел бы знать, есть ли у кого-нибудь что-то подобное, какие другие таблицы предлагаются для достижения того, что мне нужно.
Я не думаю, что было бы необходимо создать таблицу employee_holiday_period
за каждый период, потому что вся информация из запросов на отпуск уже находится в таблице employee_holiday
и я уже знаю из моей таблицы employee
дату вступления.
Надеюсь, кто-то может мне помочь или направить на это. Ценить это.
Для меня таблица employee_holiday, похоже, больше относится к журнальной таблице. Если вы не возражаете, я буду использовать разные имена, которые, я думаю, могут быть применимы не только к отпускам.
У вас будет таблица с названием employee_ leaveTime
, которая сохранит тип отпуска и количество оставшихся дней. Затем в employee_leaveTime_log
(который вы назвали employee_holiday
) вы можете зарегистрировать запрос сотрудника на отпуск (будь то отпуск, больной и т.д.), А также любые другие данные, которые вы хотите отслеживать. Затем вы вычитаете из оставшихся дней для этого конкретного типа отпуска в другой таблице. С этим вы можете лучше добавить время.
Я думаю, что с этим вы могли бы использовать его больше, чем просто отпуск
По моему пониманию я создал ниже сценарий. Часть CTE рассчитает общий отпуск сотрудника на основании его услуги в компании. "LeaveTaken" вычисляет все листья, взятые сотрудником. В конце концов, я принял разницу между общим отпуском работника и его отъездом. Если это происходит как отрицательное значение, что означает, что работник сделал предварительный отпуск, значение будет положительным.
Пропустите идентификатор сотрудника как @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