Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
mysql if Wochentage Vergleich mit Ausgabe [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
mysql if Wochentage Vergleich mit Ausgabe


 
smartdragon
24-10-2005, 18:08 
 
Hallo community,

ich habe eine Tabelle in mysql angelegt, welche Events beinhaltet.
Die Events haben ein Anfangsdatum und Enddatum (Zeitspanne).
Nun finden einige Events innerhalb der Zeitspanne jedoch nur z.B.
am Montag und am Mittwoch satt. Um dies in den Datensatz zu
speichern, habe ich Felder (tinyint) von Mo - So angelgt, welche
beim stattfinden eine 1 und sonst eine 0 bekommen.

Nun meine Frage: wie kann ich eine mysql-Abfrage gestalten, die
wenn ich ein Zeitintervall von z.B. 20.10 (Freitag) - 23.10 (Sonntag)
wähle mir alle Events ausgibt, welche eine 1 am Fr oder Sa oder So
haben?

 
Abraxax
24-10-2005, 18:47 
 
wenn ich dich richtig verstanden habe, hast du 7 zusätzliche spalten in deiner tabelle für die wochentage?

du hast je eine spalte für den start- und den endzeitpunt als TIMESTAMP (mysql) oder DATETIME?

so?

SELECT
e_start,
e_ende,
e_name
FROM
e_tabelle
WHERE
(
e_start BETWEEN '2005-10-20' AND '2005-10-23' OR
e_ende BETWEEN '2005-10-20' AND '2005-10-23'
) AND
e_weekday_fr = 1 AND
e_weekday_sa = 1 AND
e_weekday_so = 1


habs nur mal so hingeklatscht... ohne garantie ... :p

 
smartdragon
24-10-2005, 19:17 
 
Genau, ich habe 7 spalten für die Tage und für das Anfangs-/ Enddatum das date Format.
Die Abfrage ist im Moment so:

SELECT * FROM events WHERE ('$date1' <= date2) AND
('$date2' >= date1) ORDER BY date1

Nun liegt jedoch der Knackpunkt darin, das $date1 und $date2
vom User über ein select Feld eingegeben werden. Würde ich
Abfragen:

AND weekday_fr = 1 AND weekday_sa = 1...

würde er ja unabhängig ob die ausgewählte Zeitspanne ein
Freitag oder Samstag enthält die Events anzeigen, welche am
Fr || Sa eine 1 gesetzt haben.

Also müsste ich folglich alle enthaltenen Wochentage innerhalb
der Zeitspanne ($date1 $date2) abfragen und irgendwie mit
if (in der mysql-Anweisung) abfragen ob die auf 1 gesetzten Tage
der Events in der Zeitspanne enthalten sind. So ungefähr:


(auslesen aller Wochentage in der Zeitspanne) AND WHERE
(Mo = 1 || Di = 1 || Mi = 1 .... ) innerhalb der Zeitspanne

vielleicht kann man dies auch anders lösen...

 
Abraxax
24-10-2005, 19:37 
 
du hast meine sql-query oben gesehen?

 
smartdragon
24-10-2005, 20:45 
 
Ja, die habe ich gelesen und ich muss zugeben damit wäre meine Anfrage teilweise gelöst.
Ich habe zwar geschrieben z.B. Fr - So
(was die clause: (AND fr =1 AND sa = 1 AND So =1) erfüllen würde. Aber das war ein "z.B."

Ich habe jedoch auch Events gegeben welche z.B.

in der Zeitspanne vom 21.11.05 (das ist Montag) - 18.01.06 (ein Mittwoch)
und nur jeden Mo und Mi stattfinden kann.

ein anderes Event kann z.B. vom 25.11.05 (Freitag) - 02.12.05
(auch Freitag) nur jeden Di, Mi und Fr gehen.

Demnach müsste ich für jede Kombination der Wochentage ein
OR einbauen und das wäre ziemlich lastig.

 
smartdragon
24-10-2005, 20:54 
 
Evtl. kann mein Problem hierunter:

http://clients.smartdragon.de/test/veranstaltungen.php

veranschaulicht werden.

 
Abraxax
25-10-2005, 00:28 
 
dort kann ich z.b. keine wochentage als user auswahlen/ankreuzen.

also ist die ganze wochentagsabfragerei (noch) nicht von nutzen.

aber so ganz genau habe ich das mit deinen wochentagen noch immer nicht verstanden.

 
smartdragon
25-10-2005, 12:19 
 
erstmal danke und respekt, das du dich damit beschäftigst...und das
stimmt, ich als user kann und soll auch keine Wochentage ankreuzen,
das ist nur die Ausgabe. In einer Eingabemaske werden diese
angekreuzt.

Das mit den Wochentagen ist in der Tat schwer zu erklären. Aber ich
werde mein bestes geben :)

1. Es können für diese Ausgabe Events mit einem Anfangs und Enddatum
angelegt werden. (date - Format in der DB) Für Events, welche z.B.
nur einen Tag lang gehen oder für Events welche über Wochen
oder Monate hinweg gehen. (Bei ein-tages Events sind aber
Anfangs- u. Enddatum gleich daher wird nur das Anfangsdatum
angezeigt)

2. Die meisten Events, welche über einen längeren Zeitraum gehen,
finden nur ein- bis öftermal in einer Woche satt. Deshalb habe ich bei
der Eingabemaske der Events Kontrollkästchen von Mo - So gesetzt
um diesen in der DB eine 1 oder 0 zu verpassen. Bei ein-tages Events
wird kein Kästchen angekreuzt.

3. Gibt der User in der Ausgabe nun ein Datumsbereich ein, welcher
nur im Bereich vom z.B. 17.10 (ein Do) - 30.10 (ein Sa) liegt, werden
bisher auch Events angezeigt, welche nicht an diesen Tagen statt-
finden (z.B. ein Häkchen am Mo und Di haben) aber z.B. im Zeitraum
vom 20.09 - 03.12 liegen. Da dieser Event ja in dem vom User einge-
gebenen Zeitraum liegt.

4. Nun meine Frage, wie kann ich es realisieren, das dies nicht
passiert?


Das ist bestimmt nicht einfach, deswegen wende ich mich ja an euch.

(Falls Du die Eingabemaske noch sehen möchtest bitte Bescheid
sagen, damit ich die URL posten kann)

 
Abraxax
25-10-2005, 22:31 
 
nehmen wir noch einmal die bekannte query und ändern sie ein wenig ....

SELECT
e_start,
e_ende,
e_name
e_weekday_mo,
e_weekday_di,
e_weekday_mi,
e_weekday_do,
e_weekday_fr,
e_weekday_sa,
e_weekday_so,
IF(e_start=e_ende, "ja", "nein") einmalig_ja_nein
FROM
e_tabelle
WHERE
e_start BETWEEN '2005-10-20' AND '2005-10-23' OR
e_ende BETWEEN '2005-10-20' AND '2005-10-23'


wenn du diese query aufrufst, was passiert dann?

theoretisch bekommst du alle termine im angebenenen zeitraum ...... um zu erkennen, ob das ein einmaliger termin war, habe ich dir einen marker eingebaut mit dem IF. (das könnte mal auch in php prüfen, wenn mal will)

desweiteren werden grundsätzlich alle wochentage abgefragt. ist hier eine 1 drin, ist der termin an diesem tag. das ganze kann man für die ausgabe auch in php prüfen oder o.g. query entsprechend dem einen beispiel ebenfalls anpassen. (würde ich machen)

so ... jetzt bist du wieder am zuge ....

 
smartdragon
26-10-2005, 01:24 
 
Da bin ich wieder: :)

wenn du diese query aufrufst, was passiert dann?

Ich erhalte alle termine im angebenenen zeitraum. Ich habe allerdings den Marker nicht eingebaut,

1. Weil ich nicht genau weiß wie das gemeint ist (kann aber wie du im unteren Abschnitt meinst für die Tage gut sein)

2. weil es mir darum geht das bei der Ausgabe nicht zweimal das gleiche Datum stehen zu haben.
Darum habe ich die Ausgabe so unterdrückt:

"<td><strong>$Result->date1";
if ($Result->date2 !== $Result->eventdateformat)
echo " - $Result->date2";
else { };
echo "</strong></td>",


Ja, es werden alle Wochentage abgefragt und es wird eine 1 bei gesetzter 1 ausgegeben. Nun könnte man in der Ausgabe sagen schreibe anstatt der 1 den jeweiligen Wochentag hin. So kann der User erkennen, das dieser Event öfter und an welchen Tagen dieser stattfindet.

Aber es ist leider nicht so dass:

ist hier eine 1 drin, ist der termin an diesem tag.

sonden der Termin/ Event liegt in dem vom User gewählten Zeitraum z.B. ('2005-10-20' AND '2005-10-23'). Das heißt aber, das dieser Zeitraum nur 4 Wochentage hat. z.b. Mo, Di, Mi, Do.

Läuft der Termin aber über ein Jahr lang und nur jeden Fr erscheint er ja trotzdem und dies soll vermieden werden.

Andernfalls kann man nur hoffen, das der User nur Zeitspannen abfragt, indem alle Wochentage vorkommen.

Zur Veranschaulichung habe ich auf der Testseite ein TestEvent vom 30.10 - 24.11.05 erstellt, welcher nur am So und Do stattfindet.

Gibt man nun die Zeitspanne 31.10 - 2.11 ein, erhält man als Ausgabe dieses Event. Jedoch interessiert das den User nicht, weiler ja nur, durch die Datumseingabe, von Mo - Mi nach einem Event sieht und der Testevent zwar in der Zeitspanne liegt jedoch nur am Do und So stattfindet.

Es ist schwierig und ich kann nur hoffen das ich nicht versuche schon vorhandene Funktionen nachzubauen oder ähnliches.


Wie meinst Du das eigentlich?

oder o.g. query entsprechend dem einen beispiel ebenfalls
anpassen. (würde ich machen)

 
smartdragon
26-10-2005, 19:11 
 
Gebe mir alle events aus, welche zwischen date1 und date2 liegen und die einen Wochentag in der Wochentagsspalte (z.B. tuesday) mit 1 gekennzeichnet haben welcher (also der Wochentag) auch zwischen date1 und date2 liegt.

Nun macht es wahrscheinlich wenig Sinn, wenn zwischen date1 und date2 mehr als 7 Tage liegen, da ja da schon bereits alle Wochentage enthalten sind.

Also müsste die query wohl so aussehen:

Gebe mir alle events aus, welche zwischen date1 und date2 liegen und ist der Zeitraum zwischen date1 und date2 kleiner als 7 Tage, dann die die einen Wochentag in der Wochentagsspalte (z.B. tuesday) mit 1 gekennzeichnet haben welcher (also der Wochentag) zwischen date1 und date2 liegt.

Nu habe ich keine Ahnung wie ich dies in einer mysql-Syntax schreiben kann....

 
Abraxax
26-10-2005, 20:55 
 
sei mir nicht böse. aber irgendwie blicke ich durch deine logik nicht genug durch, dass ich dir noch einen tipp geben kann..... evtl versucht es mal ein anderer?

 
smartdragon
26-10-2005, 21:50 
 
Ich bin dir nicht böse :p

Aber vielleicht kann mir wirklich einer ja ne Lösung o.ä. geben.


Danke jedenfalls.


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:11 Uhr.