对于为 cron 或类似任务实现作业队列的人来说,此解决方案可能会派上用场。
假设我们有一个参考日期 (DATETIME) 和重复间隔。我们希望将这两个值存储在数据库中,并快速比较是否已经到了执行时间并将作业包含到执行队列中。
间隔可能很重要,例如(1 YEAR 12 DAYS 12 HOUR) 并由明智的用户 (admin) 控制,因此用户不会使用超出常规 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);