Zur Navigation

Datum aus mysql aus Tagesliste ausschließen - Dropdown Liste [2]

11 webuser

Hallo Jörg,
Die Abfrage habe ich mir leichter vorstellt.

Vielen Dank

Gruß
Webuser

08.03.2014 10:02

12 webuser

Hallo Jörg,
doch noch ein Fehler drin:

In meinem Beispiel wird die letzte belegte Zeit im Dez.
als frei angezeigt.
Vielleicht habe ich auch einen Fehler gemacht.

Gruss
Webuser

                      $free_days = array();

$next_start = $today = new DateTime('now');
$last_day = new DateTime('now');
$last_day->add(new DateInterval('P1Y'));

while ($row = mysql_fetch_array($result)) {
    $start = $next_start;
    $end = new DateTime($row['Von']);
    $next_start = new DateTime($row['Bis']);
    if ($end < $start) {
        continue;

    $day = $start;
    while ($day < $end) {
        $free_days[] = $day->format('d.m.Y');
        if ($day >= $last_day) {
            break 2;
        }
        $day->add(new DateInterval('P1D'));
    }

}

if ($day < $last_day) {
    while ($day < $last_day) {
        $free_days[] = $day->format('d.m.Y');
        $day->add(new DateInterval('P1D'));
    }
}

08.03.2014 10:37

13 Jörg

Die abschließende Schleife muss ebenfalls bei $next_start beginnen, damit die letzte belegte Zeit übersprungen wird:

$day = $next_start;
if ($day < $last_day) {
    while ($day < $last_day) {
        $free_days[] = $day->format('d.m.Y');
        $day->add(new DateInterval('P1D'));
    }
}

08.03.2014 23:31

14 webuser

Hallo Jörg,
sieht leider noch genauso aus.

--Ein anderer Gedankenansatz von mir:
Alle Tage in dem Jahr in ein Array einlesen. Dann mit
Msql die belegten Zeiträume löschen.--

Gruß
Webuser

von#bis
07.03.2014 # 11.03.2014
######################
angenommen wir haben heute den 04.03.2014
04.03.2014
05.03.2014
06.03.2014
07.03.2014
11.03.2014
12.03.2014
13.03.2014

09.03.2014 08:37

15 webuser

Hallo,
Könnte man nicht mit array_diff die Sache lösen?

Gruß
Webuser

09.03.2014 11:48

16 Jörg

sieht leider noch genauso aus.

Ich habe den Code gerade mal mit mehreren Datensätzen getestet, der letzte im Dezember 2014; bei mir funktioniert das einwandfrei.

Datenbank:
CREATE TABLE IF NOT EXISTS `termine` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `von` date NOT NULL,
  `bis` date NOT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `termine` (`id`, `von`, `bis`) VALUES
(1, '2014-03-16', '2014-03-23'),
(2, '2014-03-29', '2014-03-31'),
(3, '2014-12-24', '2014-12-31');

Script:
<?php

// Datenbankverbindung

$result = mysql_query("
    SELECT *
    FROM termine
    WHERE bis > CURDATE()
    ORDER BY bis
");

$free_days = array();
$next_start = $today = new DateTime('now');
$last_day = new DateTime('now');
$last_day->add(new DateInterval('P1Y'));
while ($row = mysql_fetch_array($result)) {
    $start = $next_start;
    $end = new DateTime($row['von']);
    $next_start = new DateTime($row['bis']);
    if ($end < $start) {
        continue;
    }   
    $day = $start;
    while ($day < $end) {
        $free_days[] = $day->format('d.m.Y');
        if ($day >= $last_day) {
            break 2;
        }   
        $day->add(new DateInterval('P1D'));
    }   
}
$day = $next_start;
if ($day < $last_day) {
    while ($day < $last_day) {
        $free_days[] = $day->format('d.m.Y');
        $day->add(new DateInterval('P1D'));
    }   
}

foreach ($free_days as $free_day) {
    echo $free_day . "<br>";
}

Ausgabe:
09.03.2014
10.03.2014
11.03.2014
12.03.2014
13.03.2014
14.03.2014
15.03.2014
23.03.2014
24.03.2014
25.03.2014
26.03.2014
27.03.2014
28.03.2014
31.03.2014
01.04.2014
02.04.2014
03.04.2014
04.04.2014
05.04.2014
06.04.2014
07.04.2014
08.04.2014
09.04.2014
10.04.2014
11.04.2014
12.04.2014
13.04.2014
14.04.2014
15.04.2014
16.04.2014
17.04.2014
18.04.2014
19.04.2014
20.04.2014
21.04.2014
22.04.2014
23.04.2014
24.04.2014
25.04.2014
26.04.2014
27.04.2014
28.04.2014
29.04.2014
30.04.2014
01.05.2014
02.05.2014
03.05.2014
04.05.2014
05.05.2014
06.05.2014
07.05.2014
08.05.2014
09.05.2014
10.05.2014
11.05.2014
12.05.2014
13.05.2014
14.05.2014
15.05.2014
16.05.2014
17.05.2014
18.05.2014
19.05.2014
20.05.2014
21.05.2014
22.05.2014
23.05.2014
24.05.2014
25.05.2014
26.05.2014
27.05.2014
28.05.2014
29.05.2014
30.05.2014
31.05.2014
01.06.2014
02.06.2014
03.06.2014
04.06.2014
05.06.2014
06.06.2014
07.06.2014
08.06.2014
09.06.2014
10.06.2014
11.06.2014
12.06.2014
13.06.2014
14.06.2014
15.06.2014
16.06.2014
17.06.2014
18.06.2014
19.06.2014
20.06.2014
21.06.2014
22.06.2014
23.06.2014
24.06.2014
25.06.2014
26.06.2014
27.06.2014
28.06.2014
29.06.2014
30.06.2014
01.07.2014
02.07.2014
03.07.2014
04.07.2014
05.07.2014
06.07.2014
07.07.2014
08.07.2014
09.07.2014
10.07.2014
11.07.2014
12.07.2014
13.07.2014
14.07.2014
15.07.2014
16.07.2014
17.07.2014
18.07.2014
19.07.2014
20.07.2014
21.07.2014
22.07.2014
23.07.2014
24.07.2014
25.07.2014
26.07.2014
27.07.2014
28.07.2014
29.07.2014
30.07.2014
31.07.2014
01.08.2014
02.08.2014
03.08.2014
04.08.2014
05.08.2014
06.08.2014
07.08.2014
08.08.2014
09.08.2014
10.08.2014
11.08.2014
12.08.2014
13.08.2014
14.08.2014
15.08.2014
16.08.2014
17.08.2014
18.08.2014
19.08.2014
20.08.2014
21.08.2014
22.08.2014
23.08.2014
24.08.2014
25.08.2014
26.08.2014
27.08.2014
28.08.2014
29.08.2014
30.08.2014
31.08.2014
01.09.2014
02.09.2014
03.09.2014
04.09.2014
05.09.2014
06.09.2014
07.09.2014
08.09.2014
09.09.2014
10.09.2014
11.09.2014
12.09.2014
13.09.2014
14.09.2014
15.09.2014
16.09.2014
17.09.2014
18.09.2014
19.09.2014
20.09.2014
21.09.2014
22.09.2014
23.09.2014
24.09.2014
25.09.2014
26.09.2014
27.09.2014
28.09.2014
29.09.2014
30.09.2014
01.10.2014
02.10.2014
03.10.2014
04.10.2014
05.10.2014
06.10.2014
07.10.2014
08.10.2014
09.10.2014
10.10.2014
11.10.2014
12.10.2014
13.10.2014
14.10.2014
15.10.2014
16.10.2014
17.10.2014
18.10.2014
19.10.2014
20.10.2014
21.10.2014
22.10.2014
23.10.2014
24.10.2014
25.10.2014
26.10.2014
27.10.2014
28.10.2014
29.10.2014
30.10.2014
31.10.2014
01.11.2014
02.11.2014
03.11.2014
04.11.2014
05.11.2014
06.11.2014
07.11.2014
08.11.2014
09.11.2014
10.11.2014
11.11.2014
12.11.2014
13.11.2014
14.11.2014
15.11.2014
16.11.2014
17.11.2014
18.11.2014
19.11.2014
20.11.2014
21.11.2014
22.11.2014
23.11.2014
24.11.2014
25.11.2014
26.11.2014
27.11.2014
28.11.2014
29.11.2014
30.11.2014
01.12.2014
02.12.2014
03.12.2014
04.12.2014
05.12.2014
06.12.2014
07.12.2014
08.12.2014
09.12.2014
10.12.2014
11.12.2014
12.12.2014
13.12.2014
14.12.2014
15.12.2014
16.12.2014
17.12.2014
18.12.2014
19.12.2014
20.12.2014
21.12.2014
22.12.2014
23.12.2014
31.12.2014
01.01.2015
02.01.2015
03.01.2015
04.01.2015
05.01.2015
06.01.2015
07.01.2015
08.01.2015
09.01.2015
10.01.2015
11.01.2015
12.01.2015
13.01.2015
14.01.2015
15.01.2015
16.01.2015
17.01.2015
18.01.2015
19.01.2015
20.01.2015
21.01.2015
22.01.2015
23.01.2015
24.01.2015
25.01.2015
26.01.2015
27.01.2015
28.01.2015
29.01.2015
30.01.2015
31.01.2015
01.02.2015
02.02.2015
03.02.2015
04.02.2015
05.02.2015
06.02.2015
07.02.2015
08.02.2015
09.02.2015
10.02.2015
11.02.2015
12.02.2015
13.02.2015
14.02.2015
15.02.2015
16.02.2015
17.02.2015
18.02.2015
19.02.2015
20.02.2015
21.02.2015
22.02.2015
23.02.2015
24.02.2015
25.02.2015
26.02.2015
27.02.2015
28.02.2015
01.03.2015
02.03.2015
03.03.2015
04.03.2015
05.03.2015
06.03.2015
07.03.2015
08.03.2015
09.03.2015

09.03.2014 12:52 | geändert: 09.03.2014 12:55

1 Forenmitglied fand diesen Beitrag gut

17 webuser

Hallo Jörg,
danke für deine Bemühungen.
Ich war sehr überrascht. Dann bin ich angefangen zu suchen.
Die Ursache war:
In der Original Datenbank sind die Felder VON BIS als Date
erstellt.
Beim Einlesen der Original-Daten hat mysql mit dem Standard
Import Tool beim Einlesen in eine neue Tabelle daraus Textfelder mit
10 Zeichen erstellt. Diese Daten hat dein Script richtig gelesen,
Den letzten Datensatz habe ich mit einem kleinen Script dazugefügt.
So wie es aussieht hat das Feld eine andere Eigenschaft.

Sorry, damit konnte ich nicht rechnen.

Gruß
Webuser

10.03.2014 19:35

18 webuser

Hallo,
kann man 2 Sachen noch ändern?

a)
immer die Daten zwischen den VON BIS ausschließen

z.B.
von;bis

17.03.2014;25.03.2014

gezeigt wird
12.03.2014
13.03.2014
14.03.2014
15.03.2014
16.03.2014
17.03.2014
25.03.2014
26.03.2014
...usw

b)
es müssen min. 3 Tage hintereinander frei sein.

Gruß
Webuser

13.03.2014 12:35

19 Jörg

a)
immer die Daten zwischen den VON BIS ausschließen

Probier mal, zum nächsten Starttag noch einen Tag hinzuzuaddieren:

    $next_start = new DateTime($row['bis']);
    $next_start->add(new DateInterval('P1D'));

b)
es müssen min. 3 Tage hintereinander frei sein.

Sowas hatten wir ja schon in dem anderen Thread, das könntest du hier auch einbauen:

    if ($end < $start) {
        continue;
    }
    $interval = $end->diff($start);
    if ($interval->format('%a') < 3) {
        continue;
    }

13.03.2014 16:44

1 Forenmitglied fand diesen Beitrag gut

20 webuser

Danke Jörg,
perfekt gelöst.

Gruß
Webuser

14.03.2014 20:22

Beitrag schreiben (als Gast)

Beim Verfassen des Beitrages bitte die Forenregeln beachten.





[BBCode-Hilfe]