Seite 1 von 1

Events aus Datenbank auslesen

Verfasst: 03.01.2010 12:16
von Helmut
Hallo,

ich möchte aus einer Tabelle für einen Veranstaltungskalender gerne die Events der der nächsten x Tage auslesen. Das Datum ist in dem Format (12- 5-2010) in "event_day" eingetragen.

Code: Alles auswählen

$g_event = array();

$sql = 'SELECT event_id, etype_id, event_subject, event_day, 
            YEAR(CURRENT_DATE()) - YEAR(event_day) 
            event,
            DATEDIFF(event_day + INTERVAL 
            (YEAR(CURRENT_DATE) - YEAR(event_day) +
            IF(DATE_FORMAT(CURRENT_DATE, "%m%d") > 
            DATE_FORMAT(event_day, "%m%d"), 1, 0))
            YEAR, CURRENT_DATE) AS all_events
        FROM ' . CALENDAR_EVENTS_TABLE . "
        HAVING
            all_events <= 6 OR
            all_events >= 360
        ORDER BY all_events";

$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{    
        $g_event[] .= $row['all_events'];        
}

$template->assign_vars(array(
    'S_TEST_7'         =>  implode(', ', $g_event),
));
 
Irgendwie komme ich nicht weiter mit meiner Abfrage, könnt ihr mir da weiter helfen?


Gruß Helmut

Re: Events aus Datenbank auslesen

Verfasst: 03.01.2010 13:19
von Pyramide
Helmut hat geschrieben:Das Datum ist in dem Format (12- 5-2010) in "event_day" eingetragen
Da du ja mit den MySQL Datumsfunktionen darauf arbeitest, ist es wohl eher als DATE-Datentyp gespeichert.

Wenn ich den komplexen Befehl richtig lese, sollen alle Events sich jedes Jahr wiederholen? Wenn ja, würde ich mir an deiner Stelle einfach mal den Code der Geburtstagsfunktion von phpBB oder entsprechenden Mods borgen. Wenn das nicht bei jedem Event der Fall ist, würde ich die Datenstruktur an deiner Stelle in eine Beschreibungs- und eine Datumstabelle aufteilen. In der Beschreibungstabelle steht dann z.B. "Sylvester - 31.12. - jährlich wiederholen" und daraus würde dann ein regelmäßiger Cronjob in eine zweite Tabelle z.B. den 31.12.2009 und den 31.12.2010 eintragen. Dann kannst du deine Abfrage hinterher auf ein simples "WHERE event_date BETWEEN curdate() AND (curdate() + INTERVAL 5 DAY)" reduzieren.

Re: Events aus Datenbank auslesen

Verfasst: 03.01.2010 17:58
von Helmut
Hallo Pyramide,

ich habe mir die Funktion für die Geburtstage mal angeschaut, im Prinzip würde das auch gehen. Das Problem liegt aber in der Formatierung des Datums, denn curdate() erwartet es in 2009- 5-12, also genau anders herum als es in der Spalte vom Kalender Mod bzw. in "user_birthday" eingetragen ist. Die Tabelle kann ich nicht umbauen, da diese zu einem Kalender Mod gehört und schon so fertig ist.

Ich brauche also jetzt eine Lösung wo ich bei der Abfrage das Datumsformat so umwandle damit es von curdate() verwendet werden kann?

Code: Alles auswählen

$event_list = '';

$now = getdate(time() + $user->timezone + $user->dst - date('Z'));
$sql = 'SELECT event_id, etype_id, event_subject, event_day
    FROM ' . CALENDAR_EVENTS_TABLE . "
    
    WHERE event_day BETWEEN curdate() AND (curdate() + INTERVAL 5 DAY)
    LIKE '" . $db->sql_escape(sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year'])) . "%'";
    
$result = $db->sql_query($sql);

while ($row = $db->sql_fetchrow($result))
{
    $event_list .= (($event_list != '') ? ', ' : '') . ($row['event_subject'] . $row['event_day']);
}
$db->sql_freeresult($result);

$template->assign_vars(array(
    'S_TEST_7'         =>  $event_list,
));
 

Gruß Helmut

Re: Events aus Datenbank auslesen

Verfasst: 03.01.2010 19:45
von Unimatrix_0
Helmut hat geschrieben: ...
Ich brauche also jetzt eine Lösung wo ich bei der Abfrage das Datumsformat so umwandle damit es von curdate() verwendet werden kann?
...
Gruß Helmut
Ich klau dann mal von anderer Stelle:
Dr.Death hat geschrieben:... die einfachste Lösung wäre es, das Datum komplett auszulesen ( Format TT.MM.JJJJ ),
dann per explode() an den Punkten zu zerstückeln und Rückwärts wieder zusammen zu setzen.
...
http://www.phpbb.de/community/viewtopic ... 4#p1152887

Sollte damit auch für dich machbar sein das Datum brauchbar umzuwandeln, hoffe ich :)

Lg Un1

Re: Events aus Datenbank auslesen

Verfasst: 03.01.2010 20:41
von Pyramide
Tja, nur hilft das leider weder hier noch in dem anderen Beitrag...denn die PHP-Funktion explode() kann man weder bei ORDER BY noch bei WHERE in einer SQL-Abfrage verwenden.

Sinnvollerweise sollte man die Datenbank so designen, dass alle Anforderungen ohne unnötige Umwege damit abbildbar sind. Aber da sich die Anforderungen und Rahmenbedingungen in diesem Thema nach jedem Beitrag zu ändern scheinen, wird das wohl schwer werden.

Re: Events aus Datenbank auslesen

Verfasst: 03.01.2010 21:11
von Helmut
Hallo Pyramide,

die Anforderungen haben sich keineswegs geändert, ich brauche immer noch die gleiche Lösung.

Ich habe eine Tabelle, in dem Fall vom Kalender Mod bei dem die Events in diesem Datumsformat (12- 5-2010) abgelegt sind und ich möchte aus der Tabelle alle Events haben die Heute und in den folgenden x Tagen anstehen, auch Monats- und Jahres übergreifend.

Ich habe deine Anregung mit curdate() aufgegriffen aber dann festgestellt, dass da das Datumsformat eben genau anders herum, also 2009- 5-12 gebraucht wird. Daher meine zweite Frage wie ich innerhalb der SQL Abfrage das Datum in das passende Format bekomme.

Alternativ würde mir auch eine andere Lösung zusagen wenn eben nur die entsprechenden Datensätze ausgelesen werden.

Das Format des Datums kann ich in der Tabelle nicht ändern da dann der Mod nicht mehr funktionieren würde. Das Design der Datenbank bzw. des Mods stammt nicht von mir, ich muss daher mit dem klar kommen was da ist.


[EDIT]
Das Problem hat sich gelöst, der Kalender Mod hatte bereits eine solche Funktion eingebaut, diese wurde aber bis jetzt nicht verwendet und ist auch nicht näher Dokumentiert.

Trotzdem würde ich gerne noch die Lösung haben wie ich in einer SQL Abfrage das Datum so umändere, dass es für z.B. curdate() passt.

Gruß Helmut