中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL怎么去除重疊時間

發布時間:2021-08-22 19:32:44 來源:億速云 閱讀:384 作者:chen 欄目:開發技術

這篇文章主要介紹“MySQL怎么去除重疊時間”,在日常操作中,相信很多人在MySQL怎么去除重疊時間問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL怎么去除重疊時間”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • 需求:

  •  開車:

  • 思路:

  • 實現:        

         我個人并不推薦在實際開發中使用存儲過程,充滿了各種的不方便,之所以寫這東西,全在于學習,如果有高手看到我的內容有問題,可以隨時指出或向我開炮。 

需求:

        在生產中常常出現計算兩個時間差的業務,比如總宕機時間、總開通會員時間等等。。。但是這些時間往往不是連貫的,斷斷續續,甚至可能會出現重疊的情況。無法直接求出時間差。

例如:

MySQL怎么去除重疊時間

MySQL怎么去除重疊時間

 開車:

        一開始,我想的是用單條SQL實現,例如:↓

SELECT TIMESTAMPDIFF(MINUTE, '2021-08-19 14:30:00', '2021-08-19 15:00:00') FROM DUAL;

 我發現,數據庫數據千千萬,不可能這樣,也不可能用UNION這種東西去拼接,數據很多,就一定會有循環,所以,在不使用Java語言的情況下,我選擇嘗試用存儲過程來解決以下這個問題。

思路:

         首先,一次進入循環的數據不會進行計算,防止后邊的數據和它有重疊,

        從第二條數據開始,就要判斷開始時間是否和上一個數據重疊,如果重疊,則校驗結束時間是否也重疊,如果重疊我就啥也不干,不重疊,則把這個值賦給上一次的數據的結束時間。

        如果開始時間不再范圍內,那么需要判斷開始時間是在上一次時間的之前還是之后

        如果這個范圍之前,把這個值賦給上一次的數據的開始時間。

        在這個范圍之后,計算并賦值

        最后一次循環也要計算并賦值

實現:        

首先創建表,模擬數據

CREATE TABLE test01 (
  id int(32) unsigned NOT NULL AUTO_INCREMENT,
  start_time datetime NOT NULL,
  end_time datetime NOT NULL,
  PRIMARY KEY (`id`)
) 
 
INSERT INTO test01(id, start_time, end_time) VALUES (1, '2021-08-18 16:27:51', '2021-08-18 17:27:59');
INSERT INTO test01(id, start_time, end_time) VALUES (2, '2021-08-18 17:20:26', '2021-08-18 20:10:37');
INSERT INTO test01(id, start_time, end_time) VALUES (3, '2021-08-18 22:05:57', '2021-08-18 23:55:20');

 MySQL怎么去除重疊時間

 創建存儲過程:

CREATE PROCEDURE sumTime()
BEGIN
    -- 定義變量 
 
    -- 是否首次
    DECLARE is_old int(1) DEFAULT 0;
 
    -- 上一次數據
	DECLARE old_start_time datetime;
	DECLARE old_end_time datetime;
 
	-- 本次數據
	DECLARE start_time datetime;
	DECLARE end_time datetime;
 
	-- 返回結果
	DECLARE num int(32) DEFAULT 0;
 
	-- 循環結束開關
	DECLARE done int DEFAULT 0;
 
	-- 創建游標(查詢數據庫數據)
	DECLARE list CURSOR FOR SELECT a.start_time, a.end_time FROM test01 a;
 
    -- 定義最后一次循環時設置 循環結束開關 為 1
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
 
	-- 開啟游標
	OPEN list;
 
		-- 開啟循環
		posLoop:LOOP
			-- 取值 將當前循環的值取出 賦值給當前數據變量
			FETCH list INTO start_time,end_time;
			-- 判斷是否首次
			if (is_old = 0) THEN 
 
				SET is_old = 1;
				SET old_start_time = start_time;
				SET old_end_time = end_time;
 
			-- 否則
			ELSE
				-- 校驗是否在區間內
				 if (start_time >= old_start_time AND start_time <= old_end_time) THEN
 
					-- 校驗結束時間是否不在在區間內
				   if (end_time < old_start_time OR end_time > old_end_time) THEN
						SET old_end_time = end_time;
				   END IF;
 
				 -- 否則
				 ELSE
 
				   if (start_time < old_start_time )  THEN
 
						SET old_start_time = start_time;
 
					 ELSE
 
						SET num = num + TIMESTAMPDIFF(MINUTE, old_start_time, old_end_time);
						SET old_start_time = start_time;
						SET old_end_time = end_time;
					 END IF;
				 END IF;
			END IF;
			-- 校驗是否最后一次循環
			IF done=1 THEN 
			    SET num = num + TIMESTAMPDIFF(MINUTE, old_start_time, old_end_time);
			    LEAVE posLoop;
			END IF;
		-- 結束循環	
		END LOOP posLoop;
	-- 關閉游標 
	CLOSE list;
	SELECT num;
END;
-- 調用存儲過程
call sumTime();

 MySQL怎么去除重疊時間

-- 刪除存儲過程
drop procedure if exists sumTime;

到此,關于“MySQL怎么去除重疊時間”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青河县| 南乐县| 永福县| 浏阳市| 古丈县| 富顺县| 柘荣县| 锦州市| 六盘水市| 遂平县| 南昌市| 宁强县| 禹城市| 隆化县| 东阿县| 长顺县| 吉林省| 古丈县| 昭通市| 嵊泗县| 思茅市| 民乐县| 历史| 肃宁县| 庄浪县| 湟源县| 仁怀市| 崇州市| 天柱县| 南阳市| 南京市| 新竹县| 丹寨县| 黎川县| 教育| 阿瓦提县| 弥渡县| 襄汾县| 鄂州市| 松江区| 清丰县|