Gültig von/bis

Gültig von/bis

am 12.04.2007 15:36:49 von Oliver Benning

Hallo,

ich habe einen Fussball-Spielplan programmiert. Die Datensätze der
Spiele enthalten ein "Gültig von" und ein "Gültig bis"-Datumsfeld und es
werden nur die angezeigt, für die "now() > Gültig von und now() < Gültig
bis" gilt.

SpielID LigaID TeamA-ID TeamB-ID GueltigVon
GueltigBis
1 1 1 3
02.04.2007 00:00:00 07.04.2007 17:30:00
2 1 2 4
02.04.2007 00:00:00 07.04.2007 17:30:00
3 1 3 5
02.04.2007 00:00:00 07.04.2007 17:30:00
4 1 6 8
02.04.2007 00:00:00 07.04.2007 17:30:00
5 1 1 2
12.04.2007 00:00:00 14.04.2007 17:30:00
6 1 3 4
12.04.2007 00:00:00 14.04.2007 17:30:00
7 1 5 6
12.04.2007 00:00:00 14.04.2007 17:30:00
8 1 7 8
12.04.2007 00:00:00 14.04.2007 17:30:00

SELECT * FROM spiele WHERE GueltigVon < now() AND GueltigBis > now()
liefert mir alle aktuell gültigen Spiele (SpielID 5 bis 8)

Wie kann ich nun die Spiele aller Mannschaften selektieren, die vom
vorherigen Spieltag waren (SpielID 1 bis 4), ohne jetzt extra eine
Spielplan-Nummer einzuführen?


Gruß,
Oliver

Re: Gültig von/bis

am 12.04.2007 16:43:00 von Christian Schmidt

Oliver Benning schrieb:
> Hallo,
>
> ich habe einen Fussball-Spielplan programmiert. Die Datensätze der
> Spiele enthalten ein "Gültig von" und ein "Gültig bis"-Datumsfeld und es
> werden nur die angezeigt, für die "now() > Gültig von und now() < Gültig
> bis" gilt.

> SELECT * FROM spiele WHERE GueltigVon < now() AND GueltigBis > now()
> liefert mir alle aktuell gültigen Spiele (SpielID 5 bis 8)
>
> Wie kann ich nun die Spiele aller Mannschaften selektieren, die vom
> vorherigen Spieltag waren (SpielID 1 bis 4), ohne jetzt extra eine
> Spielplan-Nummer einzuführen?

Vergleiche statt mit now() mit dem Datum von gestern.

Oder was meinst Du?

Christian

Re: Gültig von/bis

am 12.04.2007 16:44:01 von Sebastian Suchanek

Oliver Benning schrieb:

> [...]
> Wie kann ich nun die Spiele aller Mannschaften selektieren, die vom
> vorherigen Spieltag waren (SpielID 1 bis 4), ohne jetzt extra eine
> Spielplan-Nummer einzuführen?

Ungetestet:

SELECT `TeamA-ID`, `TeamB-ID`
FROM spiele
WHERE GueltigVon < DATE_SUB(NOW(), INTERVAL 1 DAY)
AND GueltigBis > DATE_SUB(NOW(), INTERVAL 1 DAY)

Falls das so nicht funktioniert, solltest Du im MySQL-Handbuch
unter "Date and Time functions" nachschauen.


HTH,

Sebastian

Re: Gültig von/bis

am 13.04.2007 10:35:18 von Oliver Benning

Sebastian Suchanek wrote:
> Oliver Benning schrieb:
>
>> [...]
>> Wie kann ich nun die Spiele aller Mannschaften selektieren, die vom
>> vorherigen Spieltag waren (SpielID 1 bis 4), ohne jetzt extra eine
>> Spielplan-Nummer einzuführen?
>
> Ungetestet:
>
> SELECT `TeamA-ID`, `TeamB-ID`
> FROM spiele
> WHERE GueltigVon < DATE_SUB(NOW(), INTERVAL 1 DAY)
> AND GueltigBis > DATE_SUB(NOW(), INTERVAL 1 DAY)
>
> Falls das so nicht funktioniert, solltest Du im MySQL-Handbuch
> unter "Date and Time functions" nachschauen.

Der vorherige Spieltag bedeutet aber nicht unbedingt, daß er gestern
gewesen sein muß, oder vor einer Woche. Bei der Winterpause war der
vorherige Spieltag z.B. auch vor einigen Wochen.

Es soll also unabhängig von einem INTERVAL sein.

Re: Gültig von/bis

am 13.04.2007 10:39:55 von Oliver Benning

Christian Schmidt wrote:
> Oliver Benning schrieb:
>> ich habe einen Fussball-Spielplan programmiert. Die Datensätze der
>> Spiele enthalten ein "Gültig von" und ein "Gültig bis"-Datumsfeld
>> und es werden nur die angezeigt, für die "now() > Gültig von und
>> now() < Gültig bis" gilt.
>
>> SELECT * FROM spiele WHERE GueltigVon < now() AND GueltigBis > now()
>> liefert mir alle aktuell gültigen Spiele (SpielID 5 bis 8)
>>
>> Wie kann ich nun die Spiele aller Mannschaften selektieren, die vom
>> vorherigen Spieltag waren (SpielID 1 bis 4), ohne jetzt extra eine
>> Spielplan-Nummer einzuführen?
>
> Vergleiche statt mit now() mit dem Datum von gestern.
>
> Oder was meinst Du?

Es ist nicht bekannt, wann der vorherige Spieltag war und das ist je
nach Liga auch unterschiedlich.

Ich muß also folgende Dinge berücksichtigen:

- GueltigBis < now() (nur bereits gelaufene Spiele)
- Nur ein Spiel pro Team (Team kann als TeamA-ID bzw. TeamB-ID
auftauchen)

Der letzte Punkt macht mir Kopfzerbrechen.

Re: Gültig von/bis

am 13.04.2007 11:01:36 von Christian Schmidt

Oliver Benning schrieb:
> Christian Schmidt wrote:
>> Oliver Benning schrieb:
>>> ich habe einen Fussball-Spielplan programmiert. Die Datensätze der
>>> Spiele enthalten ein "Gültig von" und ein "Gültig bis"-Datumsfeld
>>> und es werden nur die angezeigt, für die "now() > Gültig von und
>>> now() < Gültig bis" gilt.
>>
>>> SELECT * FROM spiele WHERE GueltigVon < now() AND GueltigBis > now()
>>> liefert mir alle aktuell gültigen Spiele (SpielID 5 bis 8)
>>>
>>> Wie kann ich nun die Spiele aller Mannschaften selektieren, die vom
>>> vorherigen Spieltag waren (SpielID 1 bis 4), ohne jetzt extra eine
>>> Spielplan-Nummer einzuführen?
>>
>> Vergleiche statt mit now() mit dem Datum von gestern.
>>
>> Oder was meinst Du?
>
> Es ist nicht bekannt, wann der vorherige Spieltag war und das ist je
> nach Liga auch unterschiedlich.
>
> Ich muß also folgende Dinge berücksichtigen:
>
> - GueltigBis < now() (nur bereits gelaufene Spiele)
> - Nur ein Spiel pro Team (Team kann als TeamA-ID bzw. TeamB-ID auftauchen)
>
> Der letzte Punkt macht mir Kopfzerbrechen.
>

ORDER BY GueltigBis DESC
DISTINCT bzw. LIMIT 1

Gruß

Christian

Re: Gültig von/bis

am 13.04.2007 12:15:25 von Sebastian Suchanek

Oliver Benning schrieb:
> Sebastian Suchanek wrote:
>> Oliver Benning schrieb:
>>
>>> [...]
>>> Wie kann ich nun die Spiele aller Mannschaften selektieren, die vom
>>> vorherigen Spieltag waren (SpielID 1 bis 4), ohne jetzt extra eine
>>> Spielplan-Nummer einzuführen?
>> Ungetestet:
>>
>> SELECT `TeamA-ID`, `TeamB-ID`
>> FROM spiele
>> WHERE GueltigVon < DATE_SUB(NOW(), INTERVAL 1 DAY)
>> AND GueltigBis > DATE_SUB(NOW(), INTERVAL 1 DAY)
>>
>> Falls das so nicht funktioniert, solltest Du im MySQL-Handbuch
>> unter "Date and Time functions" nachschauen.
>
> Der vorherige Spieltag bedeutet aber nicht unbedingt, daß er gestern
> gewesen sein muß, oder vor einer Woche. Bei der Winterpause war der
> vorherige Spieltag z.B. auch vor einigen Wochen.
>
> Es soll also unabhängig von einem INTERVAL sein.

Abermals ungetestet:

(SELECT `TeamA-ID` AS Team
FROM spiele
WHERE DATE(GueltigBis) IN
(SELECT DISTINCT DATE(GueltigBis) AS Datum
FROM spiele
WHERE Datum < NOW()
ORDER BY Datum DESC LIMIT 1
)
)
UNION
(SELECT `TeamB-ID` AS Team
FROM spiele
WHERE DATE(GueltigBis) IN
(SELECT DISTINCT DATE(GueltigBis) AS Datum
FROM spiele
WHERE Datum < NOW()
ORDER BY Datum DESC LIMIT 1
)
)

Das liefert Dir - so es funktioniert ;-) - auch gleich alle Teams
in einer Spalte. Diese Query braucht allerdings aufgrund der
Subqueries MySQL mindestens in der Version 4.1, ansonsten mußt Du
die Subqueries auf die Applikationsebene auslagern.


HTH,

Sebastian