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

Seriennummer des Aktivierungsschlüssels für Windows Server 2016 Standard Key

Ich möchte den Aktivierungsschlüssel für Windows ...

Detaillierte Erklärung zum MySQL-Datenarchivierungstool mysql_archiver

Inhaltsverzeichnis I. Überblick 2. pt-archiver Ha...

Warum wird für die Webseitenkodierung UTF-8 statt GBK oder GB2312 verwendet?

Wenn Sie die Wahl haben, sollten Sie UTF-8 verwen...

display:grid in CSS3, eine Einführung in das Rasterlayout

1. Rasterlayout (Raster): Es unterteilt die Webse...

Vor- und Nachteile von MySQL-Indizes und Richtlinien zum Erstellen von Indizes

1. Warum einen Index erstellen? (Vorteile) Dies l...

Apache Calcite-Code zur Dialektkonvertierung

Definition Calcite kann SQL vereinheitlichen, ind...

Füllen Sie die Suchfunktion auf der HTML-Seite aus

Ich habe kürzlich an einem Framework gearbeitet, ...