2016-02-11 78 views
1

我有一個小時值表,類似這樣的「空白行」:灌裝使用SQL過程

|ID |Date   |Value | 
|1 |2016-1-1 01:00 |12 | 
|2 |2016-1-1 02:00 |23 | 
|3 |2016-1-1 03:00 |45 | <-- Notice gap of 3 hours 
|4 |2016-1-1 06:00 |12 | 
|5 |2016-1-1 07:00 |3  | 

我想調用過程或SQL,將填補這些差距與相應的日期和稱爲在7點15的過程的0

實施例輸出的值:

|Date   |Value | 
|2016-1-1 01:00 |12 | 
|2016-1-1 02:00 |23 | 
|2016-1-1 03:00 |45 | 
|2016-1-1 04:00 |0  | <-- Notice gap now filled 
|2016-1-1 05:00 |0  | <-- Notice gap now filled 
|2016-1-1 06:00 |12 | 
|2016-1-1 07:00 |3  | 

優選地,我也喜歡它填補任何間隙,直到當前小時。 (例如,如果我在2016-1-1 05:15將此程序調用,它將包括間隔行04:00和05:00。

雖然我沒有很多嘗試分享,但我有試圖在插入之前/之後使用觸發器填補空白,但遇到了不允許在觸發表(MySQL)上發生插入/更新的問題。以編程方式執行post-sql是可能的,但是我想使用sql來執行此操作是可行的!

+0

爲什麼不把它留給應用程序級別? – 1000111

+0

您是否打算手動調用該程序?我想如果你更喜歡每小時調用一次該程序,那麼它將更容易處理。在這種情況下,您只需關心最後完成的小時數據。 – 1000111

回答

0
  • 我們要創建一個示例表來存儲小時明智的數據/值。
  • 然後,我們將創建當打電話的程序,檢查,如果最後表格中列出了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_schedulerON在你的MySQL服務器。 以下是查詢設置event_schedulerON

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// 
  • 如果調用MultipleGapFillerProcedure這樣

    CALL MultipleGapFillerProcedure(1,3);

  • 然後,此過程將嘗試將最後連續三小時的 數據插入表中(如果不存在)。
  • 最後我覺得把這個任務留到你的應用 的等級更好。
+0

謝謝Subrata! –

+0

感謝您回答Subrata! 雖然,我相信我錯誤地問了這個問題。 我只需要填充選擇結果中的空白。 (即我不需要數據堅持在表中,我只需要填補結果集中的空白) 我已經研究了幾個類似的問題,並試圖在左側與臨時表連接,但沒有除了40秒的交易之外,得到了很多。致歉,誤導你。 –