Zur Navigation

Auflistung nach Zeitintervallen

1 tobi

Hallo Jörg,

die Datenbank ist bestückt mit sämtlichen Terminen und weiteren Angaben.

Ich würde gerne nur aufzeigen lassen, dass alle Termine von heute + 7 Tage aufgezeigt werden.

Wie wird dies realisiert?

<?php

//Einbinden von CSS Datei
include "css.php.inc";

/**
* pdo extension
*/
class MyPDO extends PDO
{

    function __construct($file = 'db-config.ini')
    {
        if (!$settings = parse_ini_file($file, TRUE))
            throw new Exception("Unable to process file: " . $file);

        $dns = $settings['database']['driver'] .
            ':host=' . $settings['database']['host'] .
            ((!empty($settings['database']['port']))
                ? (';port=' . $settings['database']['port'])
                : '') .
            ';dbname=' . $settings['database']['schema'];

        $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
        ];

        parent::__construct(
            $dns,
            $settings['database']['username'],
            $settings['database']['password'],
            $opt
        );

    }
}

$pdo = new MyPDO();
$sql = "
    SELECT
        id, wochentag, spielzeit, spielklasse, heimmannschaft,
        gastmannschaft, heimergebnis, gastergebnis
    FROM
        spielergebnisse
    WHERE
        heimmannschaft
    NOT LIKE '%spielfrei%'
    AND gastmannschaft NOT LIKE '%spielfrei%'
    ORDER BY
        spielzeit
";

try {
    printResult($pdo->query($sql)->fetchAll());
} catch (Exception $e) {
    die('Something went wrong...<br />' . $e->getMessage());
}
function printResult($res) {
    echo "
        <table class='table_gesamtspielplan'> 
            <tr>
                <td><b>Tag</b></td>
                <td><b>Datum und Uhrzeit</b></td>
                <td><b>Spielklasse</b></td>
                <td><b>Heimmannschaft</b></td>
                <td><b>Gastmannschaft</b></td>
                <td align=center><b>H</b></td>
                <td align=center><b>:</b></td>
                <td align=center><b>G</b></td>
             </tr>
    ";

    foreach ($res as $val) {
        $date = DateTime::createFromFormat('Y-m-d H:i:s', $val["spielzeit"]);
        $newDate = $date->format('d.m.Y H:i');
        echo "
        <tr>
            <td> {$val["wochentag"]} </td>
            <td> {$newDate} </td>
            <td> {$val["spielklasse"]} </td>
            <td> {$val["heimmannschaft"]} </td>
            <td> {$val["gastmannschaft"]} </td>
            <td align=center> {$val["heimergebnis"]} </td>
            <td align=center> <b>:</b></td>
            <td align=center> {$val["gastergebnis"]} </td>
        </tr>
        ";
    }
    echo "</table>";
}
?>

Gruß

17.10.2017 08:35

2 Jörg Kruse

Das hängt davon ab, in welchem Format die Termine gespeichert sind

$date = DateTime::createFromFormat('Y-m-d H:i:s', $val["spielzeit"]);

Demzufolge ist `spielzeit` im Format DATETIME gespeichert?

Mit der Funktion DATE_ADD() ließen sich dann Tage hinzurechnen:

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add

Damit ließe sich der Zeitraum als Bedingung definieren, so in etwa:

WHERE ...
AND spielzeit >= CURDATE()
AND spielzeit < DATE_ADD(CURDATE(), INTERVAL 7 DAY)

17.10.2017 09:05

3 tobi

Ja, als DATETIME



$sql = "
    SELECT
        id, wochentag, spielzeit, spielklasse, heimmannschaft,
        gastmannschaft, heimergebnis, gastergebnis
    FROM
        spielergebnisse
    WHERE
        heimmannschaft
    AND spielzeit >= CURDATE()
    AND spielzeit < DATE_ADD(CURDATE(), INTERVAL 7 DAY)                
    NOT LIKE '%spielfrei%'
    AND gastmannschaft NOT LIKE '%spielfrei%'
    ORDER BY
        spielzeit
";

Gibt nichts außer die Tabelle aus.

EDIT: falsche Reihenfolge :-)
so hätte es seien müssen:
WHERE
        heimmannschaft
    NOT LIKE '%spielfrei%'
    AND gastmannschaft NOT LIKE '%spielfrei%'
    AND spielzeit >= CURDATE()
    AND spielzeit < DATE_ADD(CURDATE(), INTERVAL 7 DAY)  
    ORDER BY
        spielzeit
";

Wenn ich jetzt 7 Tage rückwärts haben möchte, dann
AND spielzeit > DATE_SUB(CURDATE(), INTERVAL 7 DAY) 
?

17.10.2017 12:53 | geändert: 17.10.2017 13:04

4 Jörg Kruse

Meinst du die Reihenfolge der Datensätze? die wird im "ORDER BY"-Statement mit dem Schlüsselwort DESC umgedreht

ORDER BY spielzeit DESC

17.10.2017 13:14

5 tobi

In der Tabelle sind Termine von September bis April drin.

Mit o.g. wurde realisiert dass alle Termine von heute bis in 7 Tagen ausgegeben werden.

In einer anderen Datei möchte ich dann quasi die abgelaufenen Termine der letzten 7 Tage aufzeigen. Alles was innerhalb der letzten 7 Tage bis einschließlich gestern war.

17.10.2017 13:25 | geändert: 17.10.2017 13:26

6 Jörg Kruse

Achso, ja mit DATE_SUB() kannst du das Anfangsdatum errechnen, während CURDATE() dann das Enddatum des Zeitraums ist.

AND spielzeit >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND spielzeit < CURDATE()

17.10.2017 14:31

7 tobi

Perfekt. Vielen Dank.

19.10.2017 13:26

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]