Часто это требование для изменения вещей в будущем выполняется путем размещения столбцов start_date
и end_date
в вашей таблице services
.
Затем вы можете найти текущие активные сервисные строки с помощью
SELECT user_id, whatever, whatelse
FROM services
WHERE (start_date IS NULL OR start_date <= NOW())
AND (end_date IS NULL OR end_date > NOW());
. При желании вы можете создать представление с именем active_services
, автоматически фильтрующее таблицу services
для текущих активных сервисов.
CREATE VIEW active_services AS
SELECT *
FROM services
WHERE (start_date IS NULL OR start_date <= NOW())
AND (end_date IS NULL OR end_date > NOW());
Примечание - в этом дизайне end_date
содержит не последний момент, когда служба активна , а первый момент, когда она становится неактивной .Если end_date
равно нулю, служба продолжает оставаться активной.
Чтобы изменить службу или user_id
в начале следующего месяца, выполните следующие две операции:
UPDATE service
SET end_date = LAST_DAY(NOW()) + INTERVAL 1 DAY
WHERE user_id = <<user id you wish to change >>
INSERT INTO service (start_date, user_id, whatever, whatelse)
VALUES (LAST_DAY(NOW()) + INTERVAL 1 DAY,
<<user id you wish to change >>,
<<whatever>>,
<<whatelse>>;
Затем,когда наступит следующий месяц, представление active_services
вернет новую услугу.Это гораздо надежнее, чем полагаться на точно рассчитанную месячную работу.Если вы делаете ежемесячную работу, она может работать в любое время.Он просто очищает просроченные сервисы.
Вы можете использовать события MySQL для запуска определенных заданий в назначенное время.(Но некоторые общие системы MySQL не позволяют вам использовать события.)