Это решение может пригодиться кому-то, кто реализует очередь заданий для cron или чего-то подобного.
Предположим, у нас есть справочная дата (DATETIME) и интервал повторения.Мы хотели бы сохранить оба значения в базе данных и получить быстрое сравнение, если уже пора выполнять и включить задание в очередь выполнения или нет.Интервал может быть нетривиальным, например (1 ГОД 12 ДНЕЙ 12 ЧАСОВ), и управляется мудрым пользователем (администратором), так что пользователь не собирается использовать значения, превышающие диапазон обычного типа данных DATETIME, иначе преобразование должно быть выполнено первым.(18 МЕСЯЦЕВ -> 1 ГОД 6 МЕСЯЦЕВ).
Затем мы можем использовать тип данных DATETIME для хранения как значений, так и контрольной даты и интервала.Мы можем определить сохраненную функцию, используя:
DELIMITER $$
CREATE DEFINER=`my_db`@`%` FUNCTION `add_interval`(`source` DATETIME, `interval` DATETIME) RETURNS datetime
BEGIN
DECLARE result DATETIME;
SET result = `source`;
SET result=DATE_ADD(result, INTERVAL EXTRACT(YEAR FROM `interval`) YEAR);
SET result=DATE_ADD(result, INTERVAL EXTRACT(MONTH FROM `interval`) MONTH);
SET result=DATE_ADD(result, INTERVAL EXTRACT(DAY FROM `interval`) DAY);
SET result=DATE_ADD(result, INTERVAL EXTRACT(HOUR FROM `interval`) HOUR);
SET result=DATE_ADD(result, INTERVAL EXTRACT(MINUTE FROM `interval`) MINUTE);
SET result=DATE_ADD(result, INTERVAL EXTRACT(SECOND FROM `interval`) SECOND);
RETURN result;
END
Затем мы можем сделать арифметику DATETIME, используя эту функцию, например,
// test solution
SELECT add_interval('2014-07-24 15:58:00','0001-06-00 00:00:00');
// get job from schedule table
SELECT job FROM schedule WHERE add_interval(last_execution,repetition)<NOW();
// update date of executed job
UPDATE schedule SET last_execution=add_interval(last_execution,repetition);