Mysql DATE_SUB()

  • Hey,


    ich möchte, dass alle DB-Einträge der letzten 2 Wochen aus der Datenbank gezogen werden.

    Ich habe bereits gegoogelt und habe die DATE_SUB()-Function von Mysql gefunden sowie ein paar Tutorials.

    Nun habe ich es so gemacht wie ich die Nutzung gesehen habe aber es wird kein DB-Eintrag aus der Datenbank gezogen.


    Die Query wird ausgeführt, da execute True zurückgibt.


    Habt ihr eine Idee woran das liegt?


    Mein Code:

    PHP
    $selectMessages = $dbv->prepare("SELECT messageHead, message, datum FROM messages WHERE datum = DATE_SUB(datum, INTERVAL 12 DAY)");
        $result = $selectMessages->execute();
    
        // var_dump($result); -> gibt true zurück
    
        $messages = $selectMessages->fetchAll(PDO::FETCH_ASSOC);
    
        //var_dump($messages); -> gibt array(0){} zurück

    Grüße,

    Stef

  • Hat sich erübrigt.


    Mein Fehler war der Where-Teil.


    Richtig ist es so:

    $selectMessages = $dbv->prepare("SELECT messageHead, message, datum FROM messages WHERE datum >= DATE_SUB(datum, INTERVAL 12 DAY)");


    EDIT:


    Dies funktioniert doch nicht wie gehofft.

    Es werden trotz DATE_SUB alle Einträge gefetcht.


    Was ist denn daran falsch ?

  • WHERE datum >= DATE_SUB(datum, INTERVAL 12 DAY)");

    übersetzt

    Code
    -- im bsp ist datum in der row gesetzt auf 2018-04-16 00:00:00
    WHERE '2018-04-16 00:00:00' >= 2018-04-16 00:00:00 - 12 tage
    -- also
    WHERE '2018-04-16 00:00:00' >= 2018-04-04 00:00:00

    Das ist immer true.

    Code
    -- entweder du willst direkt von JETZT 12 tage zurück
    WHERE datum >= DATE_SUB(NOW(), INTERVAL 12 DAY)");
    -- oder von einem bestimmen datum
    WHERE datum >= DATE_SUB(:date, INTERVAL 12 DAY)"); -- beachte :date platzhalter


    EDIT

    Falls Du ein :date direkt angibst, könntest Du auch ohne DATE_SUB auskommen.

    SQL
    SELECT '2018-04-16 00:00:01' >= '2018-04-16 00:00:00';

    Ist true. (Ich weiß es gerade nicht 100% aber von der Logik her werden die Werte als Strings verglichen. Und ...01 ist größer als ...00)

    Code
    WHERE datum >= :date;

    Dann sollte aber :date und das Format in der db immer gleich sein.

  • Guten Morgen,


    du hast recht. Jetzt sehe ich meinen Fehler. Ich müsste NOW() in der Funktion DATE_SUB verwenden. Denn ich möchte alles, der letzten 2 Wochen, aus der DB ziehen.


    Danke für die ausführliche Erklärung.


    Gruß,

    Stef

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!