Frank: Datumsdifferenz in SQL

Ich hätte mal gern ein Problem, und zwar habe ich einen Spielplan und will berechnen, welche Heimspiele innerhalb der nächsten Woche stattfinden. Dazu hab ich folgendes SQL-Statement zusammengebastelt:

SELECT datum\_hin,uhrzeit\_hin,datum\_rueck,uhrzeit\_rueck,prefix,name,gegnermannschaftsID,wappen
                   FROM   spielpaarungen, vereine
                   AND    spielpaarungen.vereinsID= vereine.vereinsID
                   AND    (ort\_hin='heim' AND DATEDIFF(datum\_hin,'$date')<=7 AND $date <=datum\_hin)
                   OR     (ort\_hin='auswärts' AND DATEDIFF(datum\_rueck,'$date')<=7 AND $date <=datum\_rueck)

Problem ist jetzt: das liefert irgendwie nur EIN Spiel und nicht ALLE Spiele innerhalb der nächsten Woche und ich hab keine Ahnung warum.
Dazu kommt noch, dass DATEDIFF nicht in phpmyadmin benutzt werden kann, warum auch immer.

Kann mir da jemand helfen?

  1. Hallo Frank,

    Dazu hab ich folgendes SQL-Statement zusammengebastelt:

    irgendwo ist Dir der Beginn der WHERE-Klausel abhanden gekommen.

    SELECT datum\_hin,uhrzeit\_hin,datum\_rueck,uhrzeit\_rueck,prefix,name,gegnermannschaftsID,wappen
                       FROM   spielpaarungen, vereine
                       AND    spielpaarungen.vereinsID= vereine.vereinsID
                       AND    (ort\_hin='heim' AND DATEDIFF(datum\_hin,'$date')<=7 AND $date <=datum\_hin)
                       OR     (ort\_hin='auswärts' AND DATEDIFF(datum\_rueck,'$date')<=7 AND $date <=datum\_rueck)

    Selbstverständlich propagiere ich weiterhin die Verwendung der expliziten JOIN-Syntax, siehe Einführung JOINs und außerdem finde ich SQL-Statements besser lesbar, wenn sie nicht mit (hier) überflüssigen Backticks übersät sind - auch wenn ich nachvollziehen kann, dass ein Tool wie phpMyAdmin alles in Backticks packt.

    Also:

    SELECT  
        <feldliste>  
    FROM spielpaarungen sp        -- Aliasnamen sparen Schreibarbeit  
                                  -- können Statements leserlicher machen  
                                  -- sind bei mehrfacher Verwendung der selben  
                                  -- Tabelle manchmal sogar erforderlich  
    INNER JOIN vereine v          -- explizite JOIN-Syntax  
    ON sp.vereinsID = v.vereinsID -- diverse SQL-Dialekte, auch MySQL-SQL  
                                  -- erlauben auch [link:http://dev.mysql.com/doc/refman/5.0/en/join.html@title=USING (vereinsID)]  
    WHERE <bedingungen>           -- Statt Deiner DATE_DIFF-Akrobatik  
                                  -- könntest Du viel intuitiver mit  
                                  -- [link:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#id3108447@title=BETWEEN] und [link:http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#id2868724@title=DATE_ADD()] arbeiten.
    

    Code irgendeiner Programmiersprache ist bei SQL-Fragen ebenfalls nicht hilfreich, das resultierende Statement wird benötigt. Poste daher bitte die Zeichenkette, die an MySQL zur Ausführung übergeben wird, und zwar vollständig. Sonst wird man Dir kaum helfen können.

    Freundliche Grüße

    Vinzenz

    1. Hi ihr,

      AND    (ort\_hin='heim' AND DATEDIFF(datum\_hin,'$date')<=7 AND $date <=datum\_hin)
                         OR     (ort\_hin='auswärts' AND DATEDIFF(datum\_rueck,'$date')<=7 AND $date <=datum\_rueck)

      WHERE <bedingungen>           -- Statt Deiner DATE_DIFF-Akrobatik
                                    -- könntest Du viel intuitiver mit

      da würde ich gerne noch mal die Operator Precedence mit in den Raum werfen. Dein Original-Statement tut glaube ich NICHT das was du willst, es sucht nämlich Datensätze auf die alle Kriterien bis einschließlich datum_hin zutreffen ODER auf die datum_rueck zutrifft (AND bindet stärker als OR).

      MfG
      Rouven

      --
      -------------------
      Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
      1. Es lag tatsächlich an der falschen Klammerung, danke für den Tipp, jetzt funktioniert alles!