Datenbankabfrage für einen Zeitraum?

  • PHP

  • spacefluff
  • 1230 Aufrufe 9 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datenbankabfrage für einen Zeitraum?

    Hallo Leute, ich brauche Hilfe ;)

    Ich habe mir eine kleine Linkliste programmiert: Tabelle links_db (ID, URLNAME, URL, BESCHREIBUNG, DATUM)! Soweit OK!

    Nun würde ich gerne die Datenbank so abfragen, dass mir nur die Links der letzten zb. 30 Tage angezeigt werden! Geht sowas?

    Spielt das Format des Datums (in der Datenbank) eine Rolle?

    Würde mich echt freun, wenn jemand den Quelltext posten könnte!

    Danke

    LG, Spacefluff
    [SIZE="1"]UP1 (2230 MB) UP2 (720 MB) UP3 (2300 MB) UP4 (300 MB) UP5 (420 MB) UP6 (60 MB) UP7 (82 MB) UP8 (65 MB)[/SIZE]
  • wenn du bereits ein größere datenbank hast und es nicht mehr ändern kannst/möchtst dann sollte es auch so gehen:

    PHP-Quellcode

    1. function datetostamp( $date ) { //timestamp
    2. $dateelements = explode( "-", $date );
    3. $timestamp = mktime( 0, 0, 0, $dateelements[1], $dateelements[2], $dateelements[0] );
    4. return $timestamp;
    5. }
    6. $sql = "SELECT
    7. `DATUM`
    8. FROM
    9. `links_db`";
    10. $result = mysql_query($sql) or die(mysql_error);
    11. while($row = mysql_fetch_assoc($result)){
    12. if(time() - datetostamp($row['DATUM']) <= (30*24*60*60)) //überprüfen der zeitspanne 30*24*60*60 == 30 Tage
    13. echo $row['DATUM'];
    14. }
    Alles anzeigen

    habs noch nicht ausprobiert, sollte aber funktionieren
  • Also das Ding mit der While schleife ist ja wirklich umständlich...
    Das auswählen der Daten sollte man dann schon der Datenbank überlassen, die kann das schneller.
    Ob das erste Beispiel geht bin ich nicht sicher. Kann man date mit <= vergleichen?

    Es sollte auf jeden fall folgendes funktionieren:

    select * from links_db where to_days(curdate()) - to_days(datum) <= 30;
  • Was für eine DB verwendest du denn? Falls es MySQL ist würde ich meinem Vorredner zustimmen und auch

    SQL-Abfrage

    1. SELECT* FROM links_db WHERE to_days(curdate()) - to_days('DATUM') <= 30;
    verwenden. Bei anderen DB-Typen gibt es teilweise effizientere wege, die aber erst ab großen Datenmengen von Bedeutung sind.
  • Man sollte aus Performancegründen vermeiden, irgendwelche Funktionen zu nutzen. Denn sonst kann die Datenbank keinen Index nutzen; es wird stattdessen jede Zeile durchgegangen und die entsprechende Berechnung durchgeführt. Bei größeren Tabellen macht das teils erhebliche Unterschiede, denn mit Index geht das Auswählen der Tabellenwerte praktisch sofort. Es sollte natürlich auf die Datumsspalte dann auch ein Index gelegt werden.

    Die Lösung von corema ist noch langsamer (insbesondere für eine größere Datenbank wie er erwähnt!), denn das vollständige Abrufen und zeilenweise Berechnen und Verarbeiten in php ist viel rechenaufwändiger als wenn die DB das macht.

    Daher sollte man das besser wie folgt lösen und die beiden Datumswerte vorher fest in PHP in die query einfügen wenn man ein Intervall braucht:
    SELECT * FROM `links_db` WHERE DATUM <= `2008-06-01` AND DATUM > `2008-07-01`

    Wenn man nur die letzten 30 Tage braucht kann mans so in der Art machen:

    PHP-Quellcode

    1. $date_sub = 86400*30; // 30 Tage
    2. $date_min = date("Y-m-d", time() - $date_sub);
    3. mysql_query("SELECT * FROM `links_db` WHERE DATUM >= `".$date_min ."`");


    @edit: Die Abfrage von Brokensword nutzt auch den Index weil die Funktion einen für alle Spalten konstanten Wert erzeugt.