PHP Tabelle mit Date Start und Ende?

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);
Woher ich das weiß:Berufserfahrung – Ich bin gelernter Mediengestalter Digital und Print(IHK)

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
]);

Neeuugiieerriig  29.01.2025, 17:59

Leider kann ich den php-teil nicht mehr posten…

TrucksLOG 
Beitragsersteller
 29.01.2025, 18:31
@Neeuugiieerriig

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...

TrucksLOG 
Beitragsersteller
 29.01.2025, 19:41
@TrucksLOG

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...