Datumsdifferenz in SQL
Frank
- datenbank
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?
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
FROMspielpaarungen
,vereine
ANDspielpaarungen
.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
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
Es lag tatsächlich an der falschen Klammerung, danke für den Tipp, jetzt funktioniert alles!