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:
|
<<: Keine chinesische Spezialität: Webentwicklung unter kulturellen Unterschieden
>>: Detailliertes Beispiel der CSS3-Boxschatteneigenschaft
Dieser Artikel stellt hauptsächlich die Lösung fü...
nginx Nginx (Engine x) ist ein leistungsstarker H...
Ich möchte den Aktivierungsschlüssel für Windows ...
Inhaltsverzeichnis I. Überblick 2. pt-archiver Ha...
Es gibt zwei Möglichkeiten, nodejs unter Linux zu...
Frage Nachdem das Unternehmen den Server migriert...
1. Laden Sie MySQL Community Server 5.7.16 herunt...
Inhaltsverzeichnis Erste Methode App.vue Startsei...
Wenn Sie die Wahl haben, sollten Sie UTF-8 verwen...
1. Rasterlayout (Raster): Es unterteilt die Webse...
Vorwort Zum Leistungsvergleich zwischen „group by...
1. Warum einen Index erstellen? (Vorteile) Dies l...
Definition Calcite kann SQL vereinheitlichen, ind...
Ich habe kürzlich an einem Framework gearbeitet, ...