2016-06-22 127 views
0

我有日期時間類型如下表如下MySQL的日期時間獲得所有的間隔基於區間小時

Id   interval_time      processed_time 
1    2016-07-22 08:00:00     2016-07-22 09:25:00 
2   2016-07-22 09:00:00     2016-07-22 10:30:00 
3   2016-07-22 14:00:00     2016-07-22 15:23:00 
4   2016-07-22 15:00:00     2016-07-22 14:27:00 
5   2016-07-22 16:00:00     2016-07-22 15:24:00 
6   2016-07-22 17:00:00     2016-07-22 16:40:00 

我需要得到所有錯過interval_time與給定的輸入時間過去24小時。

我需要得到表中不存在的所有遺漏間隔,如下所示。

2016-07-22 10:00:00 
2016-07-22 11:00:00 
2016-07-22 12:00:00 
2016-07-22 13:00:00 

在這裏,我可以加入表的過去24小時內所有間隔的列表,但我怎麼能得到過去的24小時清單,每小時的時間間隔。

+0

這是一個空白和島嶼的問題,更糟糕的是調用存儲過程,你想了解的空白,其甚至沒有在原來存在的信息表。 –

+2

2016-07-22 09:00:00已經存在的時間間隔。那麼你是否希望在錯過的時間間隔中包含這一點? – Manish

+0

對不起,添加2016-07-22 09:00:00 - 刪除它。 – pavan

回答

1

假設'2016-07-22 22:19:00'是您要求的日期時間。然後您可以使用查詢的最後24小時狀態如下。

DB結構

CREATE TABLE IF NOT EXISTS `mytable` (
    `Id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `interval_time` datetime NOT NULL, 
    `processed_time` datetime NOT NULL, 
    PRIMARY KEY (`Id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

-- 
-- Dumping data for table `mytable` 
-- 

INSERT INTO `mytable` (`Id`, `interval_time`, `processed_time`) VALUES 
(1, '2016-07-22 08:00:00', '2016-07-22 09:25:00'), 
(2, '2016-07-22 09:00:00', '2016-07-22 10:30:00'), 
(3, '2016-07-22 14:00:00', '2016-07-22 15:23:00'), 
(4, '2016-07-22 15:00:00', '2016-07-22 14:27:00'), 
(5, '2016-07-22 16:00:00', '2016-07-22 15:24:00'), 
(6, '2016-07-22 17:00:00', '2016-07-22 16:40:00'); 

QUERY

SELECT A.mydate FROM( 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 2 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 3 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 4 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 5 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 6 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 7 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 8 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 9 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 10 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 11 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 12 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 13 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 14 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 15 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 16 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 17 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 18 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 19 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 20 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 21 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 22 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 23 HOUR,"%Y-%m-%d %H:00:00") mydate 
UNION 
SELECT DATE_FORMAT('2016-07-22 22:19:00' - INTERVAL 24 HOUR,"%Y-%m-%d %H:00:00") mydate 
) A LEFT JOIN `mytable` B ON A.mydate = B.`interval_time` WHERE B.Id IS NULL ORDER BY mydate DESC; 

檢查SQL Fiddle

爲了減少上述查詢的複雜性,可以使用存儲過程調用如下。 。

DELIMITER $$ 

CREATE PROCEDURE `LastHrs`(IN indate DATETIME) 

BEGIN 

DECLARE X INT; 
DECLARE str TEXT; 

SET X = 2; 
SET str = CONCAT('SELECT DATE_FORMAT("',indate,'" - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00") mydate'); 

WHILE X <= 24 DO 
SET str = CONCAT(str,' UNION ','SELECT DATE_FORMAT("',indate,'" - INTERVAL ',X,' HOUR,"%Y-%m-%d %H:00:00") mydate'); 
SET X = X + 1; 
END WHILE; 

SET @query = CONCAT('SELECT A.mydate FROM(',str,') A LEFT JOIN `mytable` B ON A.mydate = B.`interval_time` WHERE B.Id IS NULL ORDER BY mydate DESC'); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END$$ 
DELIMITER ; 

而且,您可以使用查詢作爲

CALL LastHrs('2016-07-22 22:19:00'); 
+1

這個排名不是爲了向任何人炫耀:p – Drew