Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

MySQL Schleife in Stored Procedure

Mitglied: facebraker

facebraker (Level 1) - Jetzt verbinden

21.03.2019 um 16:55 Uhr, 401 Aufrufe, 16 Kommentare

Hallo,

ich bin gerade echt am grübeln. Ich habe in meiner DB, bestimmte Zeiträume gespeichert.

z.B.

User_ID ; von Datum ; bisDatum ; AnzTage
1; 2019-10-14;2019-10-27;14
2; 2019-06-03;2019-06-14;12

Ich brächte eine Stored Procedure ,die über die Tage zählt und mir eine Liste der Tage ausgibt:

User_id; Tage; Wert(fest)
1;2019-10-14; X
1;2019-10-15; X
.
.
.
1;2019-10.27;X
...
2;2019-06-03;X
2;2019-06-04;X
.
.
.
2;2019-06-14;X

usw.

Ich hoffe mein Anliegen ist klar, kann mir jemand sagen wie ich das in MySQL umsetzen kann?

Vielen Dank!

Gruß Alex
Mitglied: ukulele-7
21.03.2019 um 20:00 Uhr
Das geht , abhängig von der MySQL Version, auch ohne SP und Schleife, Schleifen sind das letzte Mittel. Notwendig dafür ist CTE:
https://dev.mysql.com/doc/refman/8.0/en/with.html

Kannst du keine aktuelle Version nutzen wäre eine Schleife denkbar. Es müsste aber eine temporäre Tabelle oder eine Tabellenvariable genutzt werden.
Bitte warten ..
Mitglied: akretschmer
21.03.2019 um 20:37 Uhr
so vielleicht?

[code]
test=*# select * from facebraker ;
id | von | bis
----+------------+------------
1 | 2019-10-14 | 2019-10-27
2 | 2019-06-03 | 2019-06-14
(2 rows)

test=*# select f.von, f.bis, x.wert::date from facebraker f left join lateral (select * from generate_series(f.von, f.bis, '1day'::interval) as wert) x on (true);
von | bis | wert
------------+------------+------------
2019-10-14 | 2019-10-27 | 2019-10-14
2019-10-14 | 2019-10-27 | 2019-10-15
2019-10-14 | 2019-10-27 | 2019-10-16
2019-10-14 | 2019-10-27 | 2019-10-17
2019-10-14 | 2019-10-27 | 2019-10-18
2019-10-14 | 2019-10-27 | 2019-10-19
2019-10-14 | 2019-10-27 | 2019-10-20
2019-10-14 | 2019-10-27 | 2019-10-21
2019-10-14 | 2019-10-27 | 2019-10-22
2019-10-14 | 2019-10-27 | 2019-10-23
2019-10-14 | 2019-10-27 | 2019-10-24
2019-10-14 | 2019-10-27 | 2019-10-25
2019-10-14 | 2019-10-27 | 2019-10-26
2019-10-14 | 2019-10-27 | 2019-10-27
2019-06-03 | 2019-06-14 | 2019-06-03
2019-06-03 | 2019-06-14 | 2019-06-04
2019-06-03 | 2019-06-14 | 2019-06-05
2019-06-03 | 2019-06-14 | 2019-06-06
2019-06-03 | 2019-06-14 | 2019-06-07
2019-06-03 | 2019-06-14 | 2019-06-08
2019-06-03 | 2019-06-14 | 2019-06-09
2019-06-03 | 2019-06-14 | 2019-06-10
2019-06-03 | 2019-06-14 | 2019-06-11
2019-06-03 | 2019-06-14 | 2019-06-12
2019-06-03 | 2019-06-14 | 2019-06-13
2019-06-03 | 2019-06-14 | 2019-06-14
(26 rows)

test=*#
[/code]

allerdings müßtest Du Dein MySQL gegen PostgreSQL austauschen.
Bitte warten ..
Mitglied: em-pie
22.03.2019, aktualisiert um 07:26 Uhr
<Edit>
vergiss nachfolgendes. Nach nochmaligem lesen willst du ja den umgekehrten Weg -.-
<\edit>

Also wenn ich dich richtig verstanden habe, willst du für einen User das erste und das letzte Datum wissen und dann beide Daten von einander abziehen in die Zahl der Tage zu erhalten?

Warum dann nicht die Tabelle nochmal mit sich selbst joinen, die UserId als Key:

01.
Select a.User, a.MinDate, b.MaxDate, b.MaxDate - a.MinDate as Tage
02.
From
03.
 (select Userid, Min(Datum) as MinDate GROUP by Userid) as a
04.
 Left Join
05.
 (Select Userid, Max(Datum) as MaxDate GROUP by Userid ) as b on a.Userid = b.Userid
Oben die Differenz beider Tage musst du noch mit der richtigen Syntax versehen, da fehlt sicherlich noch ein Convert as date und ein FORMAT, dass dort Tage und kein Datum bei rauskommt...


Gruß
em-pie
Bitte warten ..
Mitglied: facebraker
22.03.2019, aktualisiert um 09:00 Uhr
@akretschmer

*lach* ... genau , aber ich möchte keine BER haben wo ich mitten in der Arbeit wichtige Komponenten wechsle.
Aber sexy ist die Lösung, behalte ich im Hinterkopf!
Bitte warten ..
Mitglied: facebraker
22.03.2019 um 09:05 Uhr
@em-pie

Ich glaube es ist noch einfacher.

Ich habe ein Start-Datum, ein End-Datum und für jeden Tag in diesem Zeitraum möchte ich einen Datensatz erzeugen, schau mal in meinen ersten post. da habe ich es versucht aufzuzeigen .

Pseudocode:

Selektiere jeden Datensatz von der Tabelle Zeitraum
Zähle von Anfangdsatum bis Enddatrum , Tageweise
Gib Datum,User_ID, Wert X aus

Nächster Durchlauf
Nächster Datensatz

So würde ich es in einer Skriptsprache machen.

Danke Gruss Alex
Bitte warten ..
Mitglied: ukulele-7
22.03.2019 um 10:51 Uhr
MSSQL (MySQL vielleicht mit der richtigen Version)
in performant:
01.
WITH tabelle(id,von,bis) AS (
02.
	SELECT 1,convert(DATE,'2019-10-14',20),convert(DATE,'2019-10-27',20) UNION ALL
03.
	SELECT 2,'2019-06-03','2019-06-14'
04.
	), t(id,von,bis,datum) AS (
05.
	SELECT	tabelle.id,tabelle.von,tabelle.bis,tabelle.von
06.
	FROM	tabelle
07.
	UNION ALL
08.
	SELECT	t.id,t.von,t.bis,dateadd(day,1,t.datum)
09.
	FROM	t
10.
	WHERE	dateadd(day,1,t.datum) <= t.bis
11.
	)
12.
SELECT	t.id,
13.
		t.datum
14.
FROM	t
15.
ORDER BY t.id,t.datum
In langsam und fehleranfällig möchte ich das eigentlich gar nicht schreiben. Es geht aber auch per Cursor oder WHILE-Schleife innerhalb einer Funktion. Die muss dann irgendwo in eine Tabelle schreiben oder eine Tabellenvariable ausspucken.
Bitte warten ..
Mitglied: akretschmer
22.03.2019 um 11:41 Uhr
Nun ja, mit MySQL hast Du ja JETZT Dein BER...
Bitte warten ..
Mitglied: facebraker
22.03.2019 um 13:53 Uhr
@akretschmer da hast du recht aber einen BER, der funktioniert , zwar nicht alle schicken Features hat , aber funktioniert.

Im Ernst das Projekt ist zu groß um im laufenden Betrieb DBMS zu ändern
Bitte warten ..
Mitglied: facebraker
22.03.2019 um 13:54 Uhr
@ukulele-7 , ich möchte eigentlich nicht die MySQL Version ändern.

Und mit temporären Tabellen, da kann ich in der Anwendung eine Funktion schreiben, die mir die Tabellen so erzeugt.

Dachte halt, es geht "einfacher" gleich in einer Abfrage.

Danke schön!
Bitte warten ..
Mitglied: ukulele-7
23.03.2019 um 09:31 Uhr
Naja wie es einfach geht (in einer Abfrage) siehst du oben, welche MySQL Version du nutzt hast du noch nicht verraten, vielleicht geht es ja.
Bitte warten ..
Mitglied: akretschmer
23.03.2019 um 11:29 Uhr
es ist nie zu spät, eine Fehlentscheidung zu korrigieren. Und: je länger Du wartest, umso höher wird der Aufwand.
Bitte warten ..
Mitglied: ukulele-7
23.03.2019 um 11:36 Uhr
Hier mal mit Funktion, Temp-Tabelle und Tabellen-Variable in der Funktion. Ist auch ein MSSQL Beispiel aber möglicherweise auf MySQL übertragbar.
01.
CREATE TABLE #tabelle(id SMALLINT,von DATE,bis DATE)
02.
INSERT INTO #tabelle
03.
SELECT 1,convert(DATE,'2019-10-14',20),convert(DATE,'2019-10-27',20)
04.
INSERT INTO #tabelle
05.
SELECT 2,convert(DATE,'2019-06-03',20),convert(DATE,'2019-06-14',20)
06.

07.
CREATE FUNCTION [dbo].[wusa](@von DATE,@bis DATE)
08.
RETURNS @dates TABLE(datum DATE)
09.
AS
10.
BEGIN
11.
	WHILE @von <= @bis
12.
	BEGIN
13.
		INSERT INTO @dates(datum)
14.
		VALUES(@von)
15.

16.
		SET		@von = dateadd(day,1,@von)
17.
	END
18.

19.
	RETURN
20.
END
21.

22.
SELECT	#tabelle.id,
23.
		f.*
24.
FROM	#tabelle
25.
CROSS APPLY [dbo].[wusa](von,bis) f
Bitte warten ..
Mitglied: akretschmer
23.03.2019 um 11:49 Uhr
Nett, @ukulele, aber bei signifikanten Datenmengen wird das von der Performance ein Horror werden ...
Bitte warten ..
Mitglied: ukulele-7
23.03.2019 um 12:14 Uhr
Das besteite ich nicht. Er hat 3 Optionen:

1) Einsatz einer MySQL Version oder einer anderen DB die CTE beherscht und dann Berechnung mit CTE zur Laufzeit.

2) Tabellenwertfunktion und damit Berechnung zur Laufzeit.

3) Trigger oder Script das die Daten generiert, dann eben nicht zur Laufzeit.
Bitte warten ..
Mitglied: akretschmer
23.03.2019 um 13:35 Uhr
4. eine DB, die lateral JOIN's und idealerweise auch noch generate_series() kann
Bitte warten ..
Mitglied: facebraker
25.03.2019 um 16:19 Uhr
Danke schön an @ukulele und @akretschmer,

ich nutze eine MySQL 5.5 ...

Die Datenmengen sind nicht so riesig , ich denke mal das würde laufen, ich muss bloss testen wie ich das mit meinen MySQL 5.5 umsetzen kann.
Zur Not muss ich halt die temporäre Tabelle zur Laufzeit per Skript erstellen.

Danke für eure Tipps

Gruß Alex
Bitte warten ..
Ähnliche Inhalte
Sicherheitsgrundlagen

Stored Cross-Site-Scripting (XSS) Schwachstelle erklärt

Anleitung von lastbreachSicherheitsgrundlagen2 Kommentare

In diesem Video erkläre ich die Schwachstelle stored Cross-Site-Scripting anhand der Gästebuch-Funktion in der unsicheren Web-Anwendung DVWA (Damn Vulnerable ...

Batch & Shell

Powershell if() Abfrage bei SQL Stored Procedure execute Fehler?

gelöst Frage von FISIStewBatch & Shell13 Kommentare

Hallo zusammen, ich bräuchte Eure Hilfe, Das unten stehende Script ist nur ein Ausschnitt und Funktioniert! Allerdings möchte ich ...

Datenbanken

SQL Trigger: Komplette Row an Stored Procedure übergeben

Frage von BirdyBDatenbanken9 Kommentare

Hallo nochmal, ich habe da nochmal eine Frage zu einem SQL-Problem: Meine aktuelle Aufgabenstellung ist es, Änderungen in einer ...

Debian

MySQL Workbench mysql old password

Frage von Fenris14Debian3 Kommentare

Hallo, ich habe hier auf einem Linux Mint den SQL-Client "MySQL Workbench" installiert. Beim anlegen einer neuen Verbindung und ...

Neue Wissensbeiträge
Off Topic
Europawahl 2019 - Ein Statement der Jugend
Information von Frank vor 13 StundenOff Topic10 Kommentare

Dies ist ein offener Brief. Ein Statement. Von einem großen Teil der Youtuber-Szene. Am Wochenende sind die EU-Wahlen und ...

Off Topic
Europawahl 2019
Information von Frank vor 1 TagOff Topic38 Kommentare

Vom 23. bis 26. Mai 2019 findet die Europawahl in den Mitgliedstaaten der Europäischen Union statt (ja auch in ...

Humor (lol)

Minister wollen offenbar Ausweispflicht für .de-Domain

Information von Kraemer vor 2 TagenHumor (lol)7 Kommentare

Zitat von Golem.de: Die zuständigen Verbraucherschutzminister fordern einem Medienbericht zufolge offenbar eine Ausweispflicht für .de-Domains. Das soll Betrugsfälle mit ...

Off Topic
Was als Noob hier mal gesagt werden musste
Information von th30ther vor 3 TagenOff Topic5 Kommentare

Moinsen wertes Forum, ich möchte mich an dieser Stelle mal beim Forum generell und bei aqui speziell bedanken! Ich ...

Heiß diskutierte Inhalte
Off Topic
Europawahl 2019
Information von FrankOff Topic38 Kommentare

Vom 23. bis 26. Mai 2019 findet die Europawahl in den Mitgliedstaaten der Europäischen Union statt (ja auch in ...

Router & Routing
ZyXEL ZyWALL USG 20 Routing
Frage von Oggy01Router & Routing16 Kommentare

Hallo, und wieder habe ich ein Problem mit dem Routing. Bis vor ein paar Tagen habe ich das mit ...

Virtualisierung
VServer (Linux): Absichern, verschlüsseln usw
Frage von mrserious73Virtualisierung11 Kommentare

Hallo zusammen, ich möchte einen Linux-Vserver mieten und diesen absichern. Darunter verstehe ich in diesem Falle hauptsächlich: Dafür sorgen, ...

Server-Hardware
Server Umbau
Frage von cyberworm83Server-Hardware10 Kommentare

Hallo zusammen, ich habe einen 19" Server (HP ProLiant DL160 G6) dieser ist auch super. ABER jetzt meine Frage: ...