PHP Tabelle mit Date Start und Ende?
Hallo. Ich suche nach einer Lösung, bei der ich leider grade nicht mehr weiterkomme.
Ich habe eine Urlaubsdatenbank mit vielen Mitarbeitern, aus der ich ein Start-Datum des Urlaubs (Bsp: 2025-01-01) und ein End-Datum (Bsp: 2025-01-07) erhalte.
Nun habe ich eine Tabelle mit dem Namen und darin sollen jetzt nach den Tagen die Columns eingefärbt werden. Dazu verwende ich die Abfrage
$insert = $this->pdo->prepare("SELECT * FROM Urlaub WHERE ma_id = :ma AND date_start > :datum AND date_end < :datum");
$insert->execute([
'ma' => $maid,
'datum' => $datum
]);
Dann erhalte ich mit days_diff die Anzahl der Tage und kann dann via colspan die Spalten einfärben.
Das klappt ganz gut, solange ein Mitarbeiter in einem Monat nur einen Urlaub hat, sobald aber 2 Urlaubstage (z.B. am 03.01.25 und am 20.01.25) eingetragen sind, macht er mir 2 Zeilen da in dem Durchlauf immer der Tag abgefragt wird und dann halt je MA 1 Urlaub abgefragt wird. Hätte da jemand eine Idee, wie ich 2 Urlaube in eine Reihe bekomme?
In dieser Tabelle sieht man dass "min" (gleicher MA (Armin aus Tabelle 1)) z.B. am 17. und am 24. Urlaub hat, dies aber in 2 Zeilen steht. Das hätte ich gerne in einer
3 Antworten
Hi TrucksLOG,
indem du die Aggregatfunktion GROUP_CONCAT() in MySQL oder eine geschicktere PHP-Verarbeitung nutzt, um mehrere Urlaube pro Mitarbeiter in einer Zeile zu halten, kannst du das Problem lösen. Hier habe ich ein angepasstes Beispiel für dich aus dem Netz:
$insert = $this->pdo->prepare("
SELECT date_start, date_end FROM Urlaub
WHERE ma_id = :ma AND date_start >= :start AND date_end <= :end
ORDER BY date_start
");
$insert->execute([
'ma' => $maid,
'start' => '2025-01-01',
'end' => '2025-01-31'
]);
$urlaube = $insert->fetchAll(PDO::FETCH_ASSOC);
Moin.
Ich bin mir nicht sicher, ob ich dein Problem ganz richtig erfasst habe.
Mein Vorschlag ist:
Anstatt zu versuchen, mit Colspan alle Urlaubstage in der Tabelle zusammenzufassen, einfach jeden Tag an dem ein Mitarbeiter Urlaub hat als einzelne Zelle einzufärben. Und wenn Thomas vier Tage hintereinander Urlaub nimmt, dann sind eben vier Tage schwarz und schon sieht es wieder wie ein Balken in der Tabelle aus.
Wäre jetzt mein Vorschlag. Es gibt sicher viele Möglichkeiten.
Viel Erfolg,
T.
$insert = $this->pdo->prepare("
SELECT * FROM Urlaub
WHERE ma_id = :ma
AND :datum BETWEEN date_start AND date_end
");
$insert->execute([
'ma' => $maid,
'datum' => $datum
]);
Das funktioniert noch nicht so ganz. Ich arbeit dran, denke es stimmt was mit dem Datum noch nicht ganz. Der gibt mir die Ulaube wild durcheinander aus...
Ich habe es hinbekommen. Vielleicht ist meine Lösung nicht ganz elegant, funktioniert aber.
Zuerst lese ich alle Mitarbeiter aus, die in dem besagten Mnat Urlaub haben.
Die lasse ich dann in einer foreach Schleife durchlaufen und frage dann nochmals mit einer for-schleife den tag von 1-31 ab. stimmt der Tag mit dem Monat überein, gibt mir SQL ein array. Dann Prüfe ich, ob die Abfrage Daten enthält und gebe diese dann aus.
Eventuell könnte man das eleganter lösen aber vorerst funktioniert es. Die Abfrage mit dem Between brachte leider immer mehrfache Datensätze.
Danke schön...
Leider kann ich den php-teil nicht mehr posten…