Я храню в своей БД требования, которые могут выполнять некоторые пользователи.Требования могут иметь статус «Различия» (хранится как события), например, «В процессе», «Завершено», «Ожидание» и т. Д.Требования имеют разные сроки выполнения, соответствующие различным этапам обработки.
Мне нужно «заморозить» некоторые сроки выполнения требований, если их текущий статус относится к списку предварительно определенных.
Например:
- Если спрос имеет статус
"A"
, мне нужно «заморозить» крайний срок от 2 до 5. - Если статус
"B"
или "C"
, я должен «заморозить» крайний срок от 3 до 5. - Если статус
"D"
, я должен «заморозить» крайний срок 4 и 5.
Я планирую использовать EVENT
, который выполняется каждый день, в 19:00, чтобы обновить (добавить 1 день) различные сроки выполнения соответствующих требований.
Структуры таблиц:
Требование таблицы
id | someDatas | deadline1 | deadline2 | deadline3 | deadline4 | deadline5
---+-----------+-----------+-----------+-----------+-----------+-----------
| | | | | |
Состояние таблицы
id | name
---+-----
|
События таблицы
id | id_demand | someOthersDatas | id_status
---+-----------+-----------------+----------
| | |
Я написалзапрос, чтобы получить требования, соответствующие списку статуса:
SELECT dem.*, st.`name` as 'statusName'
FROM `status` st
INNER JOIN `events` eve
ON eve.id_status = st.id
INNER JOIN `demand` dem
ON eve.id_demand = dem.id
WHERE st.`name` IN ('A', 'B', 'C', 'D')
AND eve.id IN
(
SELECT MAX(even.id) ev
FROM `demand` de
INNER JOIN `events` even
ON even.id_demand = de.id
GROUP BY de.id
);
Этот запрос работает отлично, и я могу получить необходимую информацию для моего лечения, у меня естьидентификатор требований, их сроки и название текущего статуса.
Я не против сохранить этот результат во временной таблице, такой как:
DROP TEMPORARY TABLE IF EXISTS pendingDemands;
CREATE TEMPORARY TABLE IF NOT EXISTS pendingDemands
SELECT /* the query shown above */
Чтобы убедиться, чтодень, который я хочу добавить к указанному сроку, действителен (= не выходной). Я написал функцию, которая вычисляет следующий действительный день:
DELIMITER //
DROP FUNCTION IF EXISTS `get_next_valid_date`;
CREATE FUNCTION `get_next_valid_date`(MyDate DATETIME) RETURNS DATETIME
BEGIN
REPEAT
SET MyDate = (DATE_ADD(MyDate, INTERVAL 1 DAY));
SET @someCondition = (select isDayOff(MyDate));
UNTIL (@someCondition = 0) END REPEAT;
RETURN MyDate;
END//
Эта функция работает отлично, и я получаю ожидаемые результаты, и isDayOff()
не нужно быть подробным.
Моя проблема в том, что я не знаю, как их использовать (временная таблица pendingDemands
и функция get_next_valid_date
) вместе для обновления таблицы demand
Я не достаточно опытен в SQL, чтобы создавать такой красивый UPDATE
запрос.
В каком направлении я могу пойти?