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

Ändern Sie den Stil des HTML-Textkörpers in JS

Inhaltsverzeichnis 1. Ursprüngliche Definition 2....

MySQL-Prozesssteuerung: IF()-, IFNULL()-, NULLIF()-, ISNULL()-Funktionen

In MySQL können Sie die Funktionen IF(), IFNULL()...

Eine kurze Erläuterung des CSS-Überlaufmechanismus

Warum müssen Sie sich eingehend mit dem CSS-Überl...

Details zur MySQL-Datenbankarchitektur

Inhaltsverzeichnis 1. MySQL-Architektur 2. Netzwe...

Der Implementierungsprozess der ECharts Multi-Chart-Verknüpfungsfunktion

Wenn viele Daten angezeigt werden müssen, ist die...

Docker-Container vom Einstieg bis zur Obsession (empfohlen)

1. Was ist Docker? Jeder kennt virtuelle Maschine...

Webdesign: Skriptmaterialien rekonstruieren das Benutzererlebnis

<br />Originaltext: http://blog.rexsong.com/...

Elementui exportiert Daten in XLSX- und Excel-Tabellen

Kürzlich habe ich vom Vue-Projekt erfahren und bi...

Docker-Overlay realisiert die Container-Kommunikation zwischen Hosts

Inhaltsverzeichnis 1. Docker-Konfiguration 2. Ers...

Konvertieren von XHTML-CSS-Seiten in Druckerseiten

<br />In der Vergangenheit musste zum Erstel...

Detaillierte Erklärung der Javascript-String-Methoden

Inhaltsverzeichnis Zeichenfolgenlänge: Länge char...