2016-06-22 21 views
0

に基づく日時のすべての間隔を得るI私はすべて与えられた入力時間との最後の24時間interval_time逃した取得する必要があり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 

を次のように日時タイプで、次の表を持っています。

次のように、テーブルに存在しないすべての不足区間を取得する必要があります。ここ

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'となります。要求されたdatetime.Thenは、次のようにクエリを使用して最後の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'); 

上記のクエリの複雑さを軽減するためのクエリ

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

関連する問題