Anzahl Tage zählen mit MySQL DB

slimox

Mitglied
Hallo zusammen,

Ich komme nicht mehr weiter..! Ich versuche die Anzahl Tage zu zählen, an welchen es Termine gibt in nur einer SQL Abfrage.
Es gibt eine Tabelle mit der Spalte TerminStart und TerminEnde, es ist ein UNIX Timestamp in diesem Feld abgelegt. Zum umwandeln verwende ich diese Funktion:
SQL:
FROM_UNIXTIME( TerminStart, '%Y-%m-%d %h:%i:%s')
Diese Termine gibt es als Beispiel:
1. Termin vom 04.06.2014 09:00Uhr bis 04.06.2014 10:00Uhr (also eine Stunde)
2. Termin vom 04.06.2014 11:00Uhr bis 04.06.2014 12:00Uhr (also eine Stunde)
3. Termin vom 04.06.2014 15:00Uhr bis 05.06.2014 15:00Uhr (also 24 Stunden)
4. Termin vom 08.06.2014 11:00Uhr bis 08.06.2014 12:00Uhr (also eine Stunde)
4. Termin vom 10.06.2014 15:00Uhr bis 12.06.2014 15:00Uhr (also 48 Stunden)
Als Antwort sollte mir die Abfrage die Zahl 5 Tage ausgeben. Da ich Tage zählen möchte, an welchen es Termine gibt und es kann mehrere Termine an einem Tage geben und der einzelne Termin kann mehrere Tage lang dauern.

Mit der Funktion
SQL:
DATEDIFF( Ende, Start)
erhalte ich nur die Differenz... Hat mir jemand einen tipp? :)
 
Hi
Wie wäre es mit einer Aufteilung in 2 Tabellen?

Tabelle 1 beinhaltet alle Tage
Tabelle 2 beinhaltet alle Termine zu den Tagen

Oder du verwendest Timestamps, damit du "range-"Abfragen machen kannst.


Gruess
 
Danke für deine Antwort. Leider ist eine Aufteilung in eine zweite Tabelle nicht möglich. Ich habe es bisher mit PHP gelöst, alle Termine in einer Schlaufe und so die Tage gezählt. Nun möchte ich diese Abfrage etwas Server schonender machen ;)
 
1. Termin vom 04.06.2014 09:00Uhr bis 04.06.2014 10:00Uhr (also eine Stunde)
2. Termin vom 04.06.2014 11:00Uhr bis 04.06.2014 12:00Uhr (also eine Stunde)
3. Termin vom 04.06.2014 15:00Uhr bis 05.06.2014 15:00Uhr (also 24 Stunden)
4. Termin vom 08.06.2014 11:00Uhr bis 08.06.2014 12:00Uhr (also eine Stunde)
4. Termin vom 10.06.2014 15:00Uhr bis 12.06.2014 15:00Uhr (also 48 Stunden)

Also, ich komme auf 6 Tage....
4-5.6 -> 2 Tage
8.6 -> 1 Tag
10-12.6 -> 3 Tage

Die Aufgabe ist nich mal so Schwer. Doch bevor du dir die Lösung anschaust, empfehle ich dir die folgende Seite http://wiki.yaslaw.info/dokuwiki/doku.php/mysql/intersectperiodes
Und hier die Lösung bei SQLFiddle: http://sqlfiddle.com/#!2/38524/22
SQL:
SELECT
	SUM(md.mdays)
FROM
	(
		-- Grösste Anzahl Tage pro Periode
		SELECT
			p.start_date,
			MAX(p.days) AS mdays
		FROM
			(
				-- überschneidungen finden und zu Perioden zusammenfassen
				SELECT
					-- Kleinstes Startdatum  der überschneidung nehmen
				   LEAST(t2.start2, t1.start1) AS start_date,
				   -- Differenz zw. grösstem Ende und kleinstem Start
					DATEDIFF(GREATEST(t2.end2, t1.end1), LEAST(t2.start2, t1.start1))+1 AS days
				FROM
					(SELECT terminid AS tid1, DATE(FROM_UNIXTIME(terminstart)) AS start1, DATE(FROM_UNIXTIME(terminende)) AS end1 FROM	termine) t1,
					(SELECT terminid AS tid2, DATE(FROM_UNIXTIME(terminstart)) AS start2, DATE(FROM_UNIXTIME(terminende)) AS end2 FROM	termine) t2
				WHERE	
					-- Nur Überschneidungen selektionieren (im Minimum ein Datensatz mit sich selber)
					LEAST(t2.end2, t1.end1) >= GREATEST(t2.start2, t1.start1)
			) p
		GROUP BY
			p.start_date
	) md
 
Zuletzt bearbeitet:
Yaslaw du bist unglaublich, wiedereinmal ein grosses DANKE! Mein Problem ist gelöst! :)
Und ja, es sind wirklich 6 Tage! Da die 48 Stunden auf 3 Tage verteilt sind! :D
 
Zuletzt bearbeitet:
Zurück