Implementierung zum Entfernen überlappender Zeiten und Berechnen der Zeitdifferenz in MySQL

Implementierung zum Entfernen überlappender Zeiten und Berechnen der Zeitdifferenz in MySQL

Ich persönlich empfehle nicht, gespeicherte Prozeduren in der tatsächlichen Entwicklung zu verwenden, da dies mit vielen Unannehmlichkeiten verbunden ist. Der Grund, warum ich dies geschrieben habe, ist, dass es mir etwas beibringt. Wenn Experten Probleme mit meinen Inhalten sehen, können sie mich gerne darauf hinweisen oder kritisieren.

brauchen:

In der Produktion muss häufig in einem Unternehmen die Differenz zwischen zwei Zeitpunkten berechnet werden, z. B. Gesamtausfallzeit, Gesamtaktivierungszeit der Mitgliedschaft usw. . . Allerdings sind diese Zeiten oft nicht zusammenhängend, sondern unterbrochen und können sich sogar überschneiden. Der Zeitunterschied lässt sich nicht direkt berechnen.

Zum Beispiel:

fahren:

Zuerst dachte ich daran, es mit einer einzigen SQL-Anweisung zu implementieren, zum Beispiel:

Wählen Sie TIMESTAMPDIFF (MINUTE, „2021-08-19 14:30:00“, „2021-08-19 15:00:00“) aus Dual aus.

Ich habe festgestellt, dass es Tausende von Datenbankdaten gibt und dies unmöglich ist. Es ist auch unmöglich, UNION zu verwenden, um sie zu verbinden. Wenn es viele Daten gibt, wird es definitiv Schleifen geben. Daher habe ich versucht, das folgende Problem zu lösen, indem ich nicht die Java-Sprache verwende, sondern gespeicherte Prozeduren verwende.

Ideen:

Erstens werden die Daten, die einmal in die Schleife eintreten, nicht berechnet, um eine Überlappung mit den nachfolgenden Daten zu verhindern.

Ausgehend vom zweiten Datensatz müssen wir feststellen, ob sich die Startzeit mit den vorherigen Daten überschneidet. Wenn dies der Fall ist, müssen wir prüfen, ob sich auch die Endzeit überschneidet. Wenn dies der Fall ist, unternehmen wir nichts. Wenn dies nicht der Fall ist, weisen wir diesen Wert der Endzeit der vorherigen Daten zu.

Liegt die Startzeit nicht mehr im Bereich, muss geprüft werden, ob die Startzeit vor oder nach der vorherigen Zeit liegt.

Liegt es vor diesem Bereich, weisen Sie diesen Wert der Startzeit der vorherigen Daten zu.

Nach diesem Bereich berechnen und zuordnen

Die letzte Schleife muss auch berechnen und zuweisen

erreichen:

Erstellen Sie zuerst eine Tabelle und simulieren Sie Daten

CREATE TABLE test01 (
  id int(32) unsigned NOT NULL AUTO_INCREMENT,
  start_time datetime NICHT NULL,
  end_time datetime NICHT NULL,
  PRIMÄRSCHLÜSSEL (`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'); 

Erstellen Sie eine gespeicherte Prozedur:

PROZEDUR ERSTELLEN sumTime()
BEGINNEN
    -- Variable definieren -- Ist dies das erste Mal, dass is_old int(1) DEFAULT 0; DECLARE wird?
 
    -- Letzte Daten DECLARE old_start_time datetime;
	DECLARE alte_Endzeit Datum/Uhrzeit;
 
	-- Diese Daten erklären start_time datetime;
	DECLARE: Endzeit Datum/Uhrzeit;
 
	-- Ergebnis zurückgeben DECLARE num int(32) DEFAULT 0;
 
	-- Schleifenende-Schalter DECLARE done int DEFAULT 0;
 
	-- Cursor erstellen (Datenbankdaten abfragen)
	DECLARE-Liste CURSOR FÜR SELECT a.Startzeit, a.Endzeit FROM test01 a;
 
    -- Definieren Sie die letzte Schleife und stellen Sie den Schleifenendeschalter auf 1
	CONTINUE HANDLER FÜR SQLSTATE '02000' DECLARE SET done=1;
 
	--Cursor öffnen, Liste öffnen;
 
		- Offene Schleife posLoop:LOOP
			-- Nehmen Sie den Wert der aktuellen Schleife und weisen Sie ihn der aktuellen Datenvariable FETCH list INTO start_time,end_time zu;
			-- Bestimmen Sie, ob es das erste Mal ist, wenn (is_old = 0) DANN 
 
				SET ist_alt = 1;
				SET alte_Startzeit = Startzeit;
				SET alte_Endzeit = Endzeit;
 
			-- ANDERS
				-- Prüfen Sie, ob es innerhalb des Intervalls liegt, wenn (Startzeit >= alte Startzeit UND Startzeit <= alte Endzeit), DANN
 
					-- Prüfen Sie, ob die Endzeit nicht im Intervall liegt, wenn (Endzeit < alte Startzeit ODER Endzeit > alte Endzeit), DANN
						SET alte_Endzeit = Endzeit;
				   ENDE, WENN;
 
				 -- ANDERS
 
				   wenn (Startzeit < alte Startzeit) DANN
 
						SET alte_Startzeit = Startzeit;
 
					 ANDERS
 
						SET Num = Num + TIMESTAMPDIFF(MINUTE, alte_Startzeit, alte_Endzeit);
						SET alte_Startzeit = Startzeit;
						SETZEN Sie alte_Endzeit = Endzeit;
					 ENDE, WENN;
				 ENDE, WENN;
			ENDE, WENN;
			-- Prüfen Sie, ob es sich um die letzte Schleife handelt. WENN fertig=1 DANN 
			    SET Num = Num + TIMESTAMPDIFF(MINUTE, alte_Startzeit, alte_Endzeit);
			    VERLASSEN Sie posLoop;
			ENDE, WENN;
		-- Beenden Sie die Schleife	
		ENDE DER SCHLEIFE posLoop;
	-- Schließen Sie den Cursor. Liste schließen.
	SELECT-Nummer;
ENDE;
-- Rufen Sie die gespeicherte Prozedur call sumTime(); auf. 

-- Löschen Sie die gespeicherte Prozedur „Drop-Prozedur“, falls „sumTime“ vorhanden ist.

Dies ist das Ende dieses Artikels zum Entfernen überlappender Zeiten und Berechnen der Zeitdifferenz in MySQL. Weitere relevante Inhalte zum Berechnen der Zeitdifferenz in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • MySQL berechnet die Anzahl der Tage, Monate und Jahre zwischen zwei Daten
  • MySQL-Funktion zur Berechnung der Zeitdifferenz
  • Detaillierte Erklärung, warum die langsame Abfrageprotokollzeit von MySQL 5.7 8 Stunden hinter der Systemzeit liegt
  • So erhalten Sie die Zeitdifferenz zwischen zwei Zeiten in einer MySQL-Abfrage

<<:  Keine chinesische Spezialität: Webentwicklung unter kulturellen Unterschieden

>>:  Detailliertes Beispiel der CSS3-Boxschatteneigenschaft

Artikel empfehlen

So konfigurieren Sie die Linux-Firewall und öffnen die Ports 80 und 3306

Port 80 ist ebenfalls konfiguriert. Geben Sie zun...

Detaillierte Erklärung der Vuex-Umgebung

Inhaltsverzeichnis Erstellen Sie eine Vuex-Umgebu...

So beheben Sie den abnormalen Start von mysql5.7.21

Ein Kollege meldete, dass eine MySQL-Instanz aufg...

So legen Sie eine statische IP für den Ubuntu 18.04-Server fest

1. Hintergrund Netplan ist ein neues Befehlszeile...

CSS erzielt den „Bottom Absorption“-Effekt im Footer

Wir stoßen häufig auf dieses Problem: Wie kann ma...

Der gesamte Prozess der Installation von mysql5.7.22 unter der ARM64-Architektur

MySQL-Download-Adresse: https://obs.cn-north-4.my...

JavaScript zum Erzielen eines Texterweiterungs- und -reduzierungseffekts

Die Implementierung des Erweiterns und Reduzieren...

Lösung zum Hinzufügen einer iptables-Firewall-Richtlinie zum MySQL-Dienst

Wenn Ihre MySQL-Datenbank auf einem CentOS7-Syste...

Mybatis-Statistiken zur Ausführungszeit jeder SQL-Anweisung

Hintergrund In letzter Zeit werde ich in Intervie...

Erläuterung des TypeScript-Namespace

Inhaltsverzeichnis 1. Definition und Verwendung 1...

Anwendungsbeispiele für die virtuelle Liste des WeChat-Applets

Inhaltsverzeichnis Vorwort Was ist eine virtuelle...