假設'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');
這是一個空白和島嶼的問題,更糟糕的是調用存儲過程,你想了解的空白,其甚至沒有在原來存在的信息表。 –
2016-07-22 09:00:00已經存在的時間間隔。那麼你是否希望在錯過的時間間隔中包含這一點? – Manish
對不起,添加2016-07-22 09:00:00 - 刪除它。 – pavan