這種解決方案可能會派上用場,以某人實施了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);
或者,您可以使用時間刻度間隔(如秒,分鐘或小時),然後執行所有日期/時間操作。 – 2012-03-20 00:00:15
哇,怪物秀。有趣的解決方案。儘管如此,即使在服務器上執行,也可能是性能問題,因爲每個語句都需要在執行前先準備好。對於一兩個人來說不算什麼大事,但幾千人就會加起來。在這種情況下,將所有計算減少爲「秒」不起作用,因爲MySQL處理間隔的默認方式有點模糊。 2012年1月1日+ INTERVAL 1年將在2013年1月1日結束。如果減少到秒,由於days_per_month和閏年等原因,會產生一些怪異的結果。 – leiavoia 2012-03-20 00:52:25