- 我們要創建一個示例表來存儲小時明智的數據/值。
然後,我們將創建當打電話的程序,檢查,如果最後表格中列出了210小時的完整數據。
[最後完成的時間意味着如果 當前時間是2016年2月12日13時10分53秒,然後最後完成的時間是 認爲是「2016年2月12日12:00:00」。]
如果最後完成的小時數據存在於表格中,那麼 程序與該小時無關。否則程序 爲最後完成的小時插入一行,如下所示:
(「2016-02-12 12:00:00」,0)。
所以來這裏的實現:
表:
CREATE TABLE `hourlyTable` (
`ID` int(11) NOT NULL AUTO_INCREMENT ,
`Date` datetime NULL DEFAULT NULL ,
`value` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);
存儲過程:
delimiter //
CREATE PROCEDURE `HourlyProcedure`()
BEGIN
DECLARE my_value INT DEFAULT -1;
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
END//
事件:
接下來我們將創建一個事件,它會在每小時的第五分鐘觸發此過程調用。
CREATE EVENT `HourlyProcedureCallEvent`
ON SCHEDULE EVERY 1 HOUR STARTS '2016-02-12 13:05:00'
ON COMPLETION PRESERVE
ENABLE
DO
CALL HourlyProcedure();
注:你必須有event_scheduler
ON
在你的MySQL服務器。 以下是查詢設置event_scheduler
ON
。
SET GLOBAL event_scheduler = ON;
其它注意事項:
正在只關心最後的完成時間的數據更容易處理。 但是,如果你真的想通過存儲過程填補多個空白,那麼下面的過程可能會得心應手。
delimiter //
CREATE PROCEDURE `MultipleGapFillerProcedure`(start INT,end INT)
BEGIN
DECLARE my_value INT DEFAULT -1;
label1 :
WHILE start <= end DO
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL start HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL start HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
SET my_value = -1;
SET start = start + 1;
END WHILE label1;
END//
爲什麼不把它留給應用程序級別? – 1000111
您是否打算手動調用該程序?我想如果你更喜歡每小時調用一次該程序,那麼它將更容易處理。在這種情況下,您只需關心最後完成的小時數據。 – 1000111