Ereignis in 7 Tagen selektieren
Chris Ross
- datenbank
0 Cheatah0 Ilja1
dedlfix
0 Chris Ross1 ChrisB
Hallo Forum,
ich probiere jetzt schon seit Stunden an folgendem Problem herum, vielleicht könnte mir mal jemand helfen:
Auf meiner Seite habe ich einen Kalender und einen Newsticker. Jetzt möchte ich Ereignisse, die in 7 Tagen eintreffen (z.B. eine Veranstaltung) über diese 7 Tage hinweg (bis zum eigentlichen Tag) durch den Newsticker ankündigen. Am Tag nach dem Ereignis soll dann logischerweise die Veranstaltung aus dem NT raus sein.
Folgendes habe ich in allen möglichen Variationen ausprobiert:
(Darin enthalten ist noch nicht die Eingrenzung bis zum Veranstaltungsende, also nicht verwirren lassen)
SELECT sdate, title, category
FROM calendar_entry
WHERE
hidden = 0 AND (DATE_SUB(CURDATE(), INTERVAL 7 DAY)) <= DATE(FROM_UNIXTIME(sdate))
ORDER BY sdate DESC
Die Spalte sdate enthält den Timestamp des Beginns der Veranstaltung.
Wer kann mir weiterhelfen?
Vielen Dank im voraus!
MfG
Chris
Hi,
Wer kann mir weiterhelfen?
selektiere die berechneten Werte, anstatt nach ihnen einzuschränken, und vergleiche sie mit dem, was Du in ihnen vermutet hast.
Cheatah
yo,
du musst bedenken, dass die Uhrzeit keine rolle spielen soll. je nachdem welchen datentyp du verwendest, musst du die zeit vorher formatieren und gegebenenfalls die uhrzeit aus dem datum rausnehmen. das gleiche gilt für die funktion CURDATE() auch hier musst du vorher die uhrzeit rausnehmen.
des weiteren musst du eine grenze nach unten und nach oben setzen, um nur den zeitraum von 7 tage zu bekommen. dafür eignet sich BETWEEN ganz hervorragend.
SELECT sdate, title, category
FROM calendar_entry
WHERE hidden = 0
AND sdate_ohne_uhrzeit BETWEEN Currdate_ohne_Uhrzeit_+1Tag AND Currdate_ohne_Uhrzeit_+7Tage
;
echo $begrüßung;
ich probiere jetzt schon seit Stunden an folgendem Problem herum, [...]
Diese Information ist für Antwortende belanglos. Aus dem was du probiert hast und woran du da gescheitert bist, ließe sich jedoch eine für dich hilfreiche Antwort erstellen.
WHERE hidden = 0 AND (DATE_SUB(CURDATE(), INTERVAL 7 DAY)) <= DATE(FROM_UNIXTIME(sdate))
Es ist ungünstig, wenn du die Werte aus den Spalten nicht direkt verwenden kannst sondern sie erst berechnen musst. In dem Fall kann nämlich kein Index beim Suchen verwendet werden, so einer auf dem Datum läge. Besser ist es, den unbehandelten Wert aus der Spalte mit einem Ausdruck zu vergleichen. Der Ausdruck kann auch aus einer Berechnung bestehen, so er keine Daten aus einer Spalte benötigt. Er wird einmalig beim Parsen berechnet und kann dann deutlich weniger aufwendig mit dem Spalteninhalt verglichen oder aus dem Index gesucht werden.
BETWEEN bietet sich in deinem Fall an, um etwas zwischen zwei Grenzen anzugeben. Da du Datumsangaben inklusive Uhrzeit vorliegen hast, ist es besser, nicht das Datum herauszuschneiden sondern bei den Suchausdrücken einen Wert inklusive Zeit anzugeben.
Die Spalte sdate enthält den Timestamp des Beginns der Veranstaltung.
Das ist ein weiteres Problem. Speichere Daten (besonders Zeitangaben) immer in einem der vom DBMS zur Verfügung gestellten und dafür bestimmten Datumstypen. Das erspart Umrechnungen, die beim Selektieren sonst für jeden Datensatz zeitverbrauchend ausgeführt werden müssen, um überhaupt erst einmal entscheiden zu können, ob er für das Ergebnis benötigt wird. Wenn du Umrechnungen benötigst, füge diese besser in das INSERT-Statement ein, als berechnete Spalte in der SELECT-Klausel oder berechne/formatiere sie außerhalb des DBMS.
Jetzt möchte ich Ereignisse, die in 7 Tagen eintreffen (z.B. eine Veranstaltung) über diese 7 Tage hinweg (bis zum eigentlichen Tag) durch den Newsticker ankündigen.
Du brauchst also die aktuelle Zeit oder den aktuellen Tag mit der Zeit von 0 Uhr als Startwert. (Letzteres, wenn auch Termine angezeigt werden sollen, die bereits laufen, aber noch nicht beendet sind, so dass sich ein Besuch vielleicht noch lohnt.) Und als oberes Kriterium willst du den aktuellen Tag plus 7 Tage und mit einer Uhrzeit von 23:59:59 haben. (Statt DATA_ADD() und DATE_SUB() lässt sich auch "wert + INTERVALL 7 DAY" notieren.)
echo "$verabschiedung $name";
Vielen Dank für die Anregungen!
Löse das jetzt über das Einlesen aller Datensätze in ein Array und dann der Selektion mit PHP. Klappt vorzüglich.
Gruß
Chris
Hi,
Löse das jetzt über das Einlesen aller Datensätze in ein Array und dann der Selektion mit PHP. Klappt vorzüglich.
Und ist ziemlich bloedsinnig.
MfG ChrisB