Datenbankeinträge nach verschieden Zeiten sortieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankeinträge nach verschieden Zeiten sortieren

    Hi,

    hab eben mal bis in Suche gestöbert, aber irgendwie wollte nicht das passende dabei sein.

    Mein Problem:
    Ich möchte gerne die Einträge der DB nach ihrem Einfügedatum sortieren. D.h. nach heute, letzten 2 Tage, letzten 7 Tage, letzten 14Tage, dieser Monat, letzten 3 Monate, letzten 6 Monate und dieses Jahr.

    PHP-Code:
        switch($time)
                {
                case 
    "today"$zeit "".date(Y)."".date(m)."".date(d)."000000"; break;
                case 
    "yesterday": {$tag date(d)-1$zeit "".date(Y)."".date(m)."".$tag."000000";} break;
                case 
    "last7": {$tag date(d) - 7$zeit "".date(Y)."".date(m)."".$tag."000000";} break;
                case 
    "last14": {$tag date(d) - 14$zeit "".date(Y)."".date(m)."".$tag."000000";} break;
                case 
    "thismonth"$zeit "".date(Y)."".date(m)."00000000"; break;
                case 
    "threemonth": {$monat date(m) - 3$zeit "".date(Y)."".$monat."00000000";} break;
                case 
    "sixmonth": {$monat date(m) - 6$zeit "".date(Y)."".$monat."00000000";} break;
                case 
    "thisyear"$zeit "".date(Y)."0000000000"; break;
                default: {
    $tag date(d) + 1$zeit "".date(Y)."".date(m)."".$tag."000000";} break;
                }; 
    Das war mein erstes geistges Produkt zu dem Thema. Doch wie sich rausstellte ziemlich fehlerhaft. u.a. Vorgänger vom Januar etc... Klar 1 - 6 ergibt -5. Was soll er da finden :-)

    Da gibts irgendwie die mktime() Funktion, doch auch damit komme ich noch nicht viel weiter.

    Vielleicht könnt ihr mir ja helfen.

    Danke
    Sayon
    Zuletzt geändert von Sayon; 30.01.2004, 12:03.

  • #2
    Re: Datenbankeinträge nach verschieden Zeiten sortieren

    speichere die zeit in einem für myal verständichen format, und schau dir dann die mysql-funktion INTERVAL() an.


    p.s.: *verschieb* nach sql.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Re: Datenbankeinträge nach verschieden Zeiten sortieren

      Original geschrieben von Sayon
      Mein Problem:
      Ich möchte gerne die Einträge der DB nach ihrem Einfügedatum sortieren. D.h. nach heute, letzten 2 Tage, letzten 7 Tage, letzten 14Tage, dieser Monat, letzten 3 Monate, letzten 6 Monate und dieses Jahr.
      Nun ja, zunächst brauchst Du doch die Zeit aus der Datenbank. Wie ist die dort gespeichert? Als timestamp oder Integer der einen Unix-Timestamp enthält? Je nachdem brauchst ein etwas anderes Skript.

      Habe ich dich richtig verstanden, dass du Einträge nicht sortieren willst, sondern einmal alle von heute, gestern oder der letzten x Wochen haben willst?

      Wenn ja, brauchst du für deine Abfrage zwei Werte, sagen wir mal $vonDatum und $bisDatum. Die Werte musst du nun erstmal errechnen. Hier meine Lösung mit Unix-Timestamps. Als Ergebnis der Funktionen erhälst Du jeweils ein assoziatives Array mit den Feldern ["start"] und ["end"]. Die erste Funktion liefert die Unix-Timestamps. Die zweite Funktion baut darauf auf und liefert die Timestamps in ein einem frei zu bestimmenden Format ($strDateFormat) zurück. Das ganze könnte für MySQL-Timestamps dann z.B. so aussehen, wenn die Einfügezeit in der Spalte "inserttime" vom Typ "timestamp" gelandet ist das ist.

      PHP-Code:
      <?
      $strDateFormat = "%Y-%m-%d %h:%i:%s";
      $strTimeCode = "last14days";
      $arrDates = getDatesByDateCode($strTimeCode,$strDateFormat);

      $sql = "SELECT * FROM meinetabelle WHERE inserttime <= '".$arrDates["end"]."' AND inserttime >= '".$arrDates["start"]."'";

      $result = mysql_query($sql);

      ...
      Solltest Du mit Unix-Timestamps (als integer Typ int) arbeiten brauchst Du im Grunde nur die Funktion getUnixtimeByDateCode() statt getDatesByDateCode() verwenden.


      Hier die Funktionen:

      PHP-Code:
      <?
      /**
      * Document::getUnixtimeByDateCode
      *
      * Die Funktion berechnet die Unix-Timestamps von bestimmten Datumsintervallen.
      * Mögliche Werte:
      *   - today: heute 00:00:00 bis 23:59:59
      *   - yesterday: gestern 00:00:00 bis 23:59:59
      *   - last7days: 7 Tage bis gestern 23:59:59
      *   - last14days: 14 Tage bis gestern 23:59:59
      *   - last21days: 21 Tage bis gestern 23:59:59
      *   - last28days: 28 Tage bis gestern 23:59:59
      *   - lastKW: Letzte Kalenderwoche von Montag 00:00:00 bis Sonntag 23:59:59
      *   - last2KW: Letzten 2 Kalenderwochen von Montag 00:00:00 bis Sonntag 23:59:59
      *   - last3KW: Letzten 3 Kalenderwochen von Montag 00:00:00 bis Sonntag 23:59:59
      *   - last4KW: Letzten 4 Kalenderwochen von Montag 00:00:00 bis Sonntag 23:59:59
      *   - thisKW: aktuelle Kalenderwoche von Montag 00:00:00 bis Sonntag 23:59:59
      *   - month: vom 1. des aktuellen Monats 00:00:00 bis gestern 23:59:59
      *   - lastmonth: vom 1. 00:00:00 bis letzten 23:59:50 des letzten Monats
      *
      * Als Ergebnis wird ein assoziatives Array mit den Felder "start" und "end" geliefert.
      *
      * Beispiel:
      *   $arrDates = parse_datecode_as_unixtime("lastkw")
      *   echo " Montag 00:00:00 letzte KW: ".$arrDates["start"]."<br>\n";
      *   echo "Sonntag 23:59:59 letzte KW: ".$arrDates["end"]."<br>\n";
      *
      * @param string $strDateCode - (today|yesterday|last7days|lastkw|month|lastmonth)
      * @return array of int
      * @author EDV Consulting Wohlers GmbH <ecw@ecw.de>
      * @author Christoph Steindorff <christoph.steindorff@ecw.de>
      */
      function getUnixtimeByDateCode($strDateCode) {
          $strDateCode = strtolower($strDateCode);
          $now = time();
          switch($strDateCode) {
              case "today":  // heute 00:00:00 bis 23:59:59
                  $intStartDate = mktime(0,0,0,date("m",$now),date("d",$now),date("Y",$now));
                  $intEndDate = mktime(23,59,59,date("m",$now),date("d",$now),date("Y",$now));
                  break;
              case "yesterday":  // gestern 00:00:00 bis 23:59:59
                  $intStartDate = mktime(0, 0, 0, date("m",$now), date("d",$now)-1, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), date("d",$now)-1, date("Y",$now));
                  break;
              case "last7days":  // die letzten VERGANGENEN 7 Tage (bis gestern 23_59:59)
                  $intStartDate = mktime(0, 0, 0, date("m",$now), date("d",$now)-7, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), date("d",$now)-1, date("Y",$now));
                  break;
              case "last14days":  // die letzten VERGANGENEN 14 Tage (bis gestern 23_59:59)
                  $intStartDate = mktime(0, 0, 0, date("m",$now), date("d",$now)-14, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), date("d",$now)-1, date("Y",$now));
                  break;
              case "last21ays":  // die letzten VERGANGENEN 21 Tage (bis gestern 23_59:59)
                  $intStartDate = mktime(0, 0, 0, date("m",$now), date("d",$now)-21, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), date("d",$now)-1, date("Y",$now));
                  break;
              case "last28days":  // die letzten VERGANGENEN 28 Tage (bis gestern 23_59:59)
                  $intStartDate = mktime(0, 0, 0, date("m",$now), date("d",$now)-28, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), date("d",$now)-1, date("Y",$now));
                  break;
              case "lastkw":  // die letzte Kalenderwoche von Montag 00:00:00 bis letzten Sonntag 23:59:59
                  $intWeekday = date("w");
                  $intStartDate = mktime(0, 0, 0, date("m",$now), (date("d",$now)-$intWeekday)-6, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), (date("d",$now)-$intWeekday), date("Y",$now));
                  break;
              case "last2kw":  // die letzten 2 Kalenderwochen von Montag 00:00:00 bis letzten Sonntag 23:59:59
                  $intWeekday = date("w");
                  $intStartDate = mktime(0, 0, 0, date("m",$now), (date("d",$now)-$intWeekday)-13, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), (date("d",$now)-$intWeekday), date("Y",$now));
                  break;
              case "last3kw":  // die letzten 3 Kalenderwochen von Montag 00:00:00 bis letzten Sonntag 23:59:59
                  $intWeekday = date("w");
                  $intStartDate = mktime(0, 0, 0, date("m",$now), (date("d",$now)-$intWeekday)-20, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), (date("d",$now)-$intWeekday), date("Y",$now));
                  break;
              case "last4kw":  // die letzten 4 Kalenderwochen von Montag 00:00:00 bis letzten Sonntag 23:59:59
                  $intWeekday = date("w");
                  $intStartDate = mktime(0, 0, 0, date("m",$now), (date("d",$now)-$intWeekday)-27, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), (date("d",$now)-$intWeekday), date("Y",$now));
                  break;
              case "month": // 1. Tag des Monats bis gestern 23:59:59
                  $intStartDate = mktime(0, 0, 0, date("m",$now), 1, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now), date("d",$now)-1, date("Y",$now));
                  break;
              case "lastmonth": // kompletter letzter Monat
                  $intStartDate = mktime(0, 0, 0, date("m",$now)-1, 1, date("Y",$now));
                  $intEndDate = mktime(23, 59, 59, date("m",$now),0, date("Y",$now));
                  break;
              default:
                  return FALSE;
          }
          $arrErg["start"] = $intStartDate;
          $arrErg["end"] = $intEndDate;
          return $arrErg;
      }

      /**
      * Document::getDatesByDateCode()
      *
      * Die Funktion berechnet Datums- und/oder Zeitwerte von bestimmten
      * Datumsintervallen gemäss der Vorgabe in $strDateFormat.
      * Die Funktion benötigt die Funktion parse_datecode_as_unixtime().
      *
      * Mögliche Werte für $strDateCode:
      *   - today: heute 00:00:00 bis 23:59:59
      *   - yesterday: gestern 00:00:00 bis 23:59:59
      *   - last7days: 7 Tage bis gestern 23:59:59
      *   - last14days: 14 Tage bis gestern 23:59:59
      *   - last21days: 21 Tage bis gestern 23:59:59
      *   - last28days: 28 Tage bis gestern 23:59:59
      *   - lastKW: Letzte Kalenderwoche von Montag 00:00:00 bis Sonntag 23:59:59
      *   - last2KW: Letzten 2 Kalenderwochen von Montag 00:00:00 bis Sonntag 23:59:59
      *   - last3KW: Letzten 3 Kalenderwochen von Montag 00:00:00 bis Sonntag 23:59:59
      *   - last4KW: Letzten 4 Kalenderwochen von Montag 00:00:00 bis Sonntag 23:59:59
      *   - thisKW: aktuelle Kalenderwoche von Montag 00:00:00 bis Sonntag 23:59:59
      *   - month: vom 1. des aktuellen Monats 00:00:00 bis gestern 23:59:59
      *   - lastmonth: vom 1. 00:00:00 bis letzten 23:59:50 des letzten Monats
      *
      * Als Ergebnis wird ein assoziatives Array mit den Felder "start" und "end" geliefert.
      *
      * Beispiel:
      *   $arrDates = getDatesByDatecode("lastkw","%Y%m%d");
      *   echo " Montag 00:00:00 letzte KW: ".$arrDates["start"]."<br>\n";
      *   echo "Sonntag 23:59:59 letzte KW: ".$arrDates["end"]."<br>\n";
      *
      * @param string $strDateCode - (today|yesterday|last7days|lastkw|month|lastmonth)
      * @param string $strDateFormat Formatierungsstring (z.B. "%Y%m%d")
      * @return array of string
      * @author EDV Consulting Wohlers GmbH <ecw@ecw.de>
      * @author Christoph Steindorff <christoph.steindorff@ecw.de>
      */
      function getDatesByDatecode($strDateCode, $strDateFormat) {
          if ($arrDates = getUnixtimeByDateCode($strDateCode)) {
              $arrErg["start"] = date($strDateFormat,$arrDates["start"]);
              $arrErg["end"] = date($strDateFormat,$arrDates["end"]);
              return $arrErg;
          } else {
              return FALSE;
          }
      }
      ?>
      Klappt´s?
      Zuletzt geändert von cst; 30.01.2004, 12:17.
      Ich denke, also bin ich.
      Manche sind trotzdem!

      Kommentar


      • #4
        Danke dir!

        Du hattest mich richtig verstanden. Allerdings musst ich die eine Funktion noch etwas abändern, da ansonsten irgendwie der heutige Tag sowie der Jahreswechsel nicht richtig erfasst wurden .

        Sieht nun so aus:
        PHP-Code:
        function getUnixtimeByDateCode($strDateCode) {
            
        $strDateCode strtolower($strDateCode);
            
        $now time();
            switch(
        $strDateCode) {
                case 
        "today":  // heute 00:00:00 bis 23:59:59
                    
        $intStartDate mktime(0,0,0,date("m",$now),date("d",$now),date("Y",$now));
                    
        $intEndDate mktime(23,59,59,date("m",$now),date("d",$now)+1,date("Y",$now));
                    break;
                case 
        "yesterday":  // gestern 00:00:00 bis heute 23:59:59
                    
        $intStartDate mktime(000date("m",$now)-1$tagdate("Y",$now));
                    
        $intEndDate mktime(235959date("m",$now), date("d",$now)+1date("Y",$now));
                    break;
                case 
        "last7":  // die letzten VERGANGENEN 7 Tage (bis heute 23_59:59)
                    
        $intStartDate mktime(000date("m",$now), date("d",$now)-7date("Y",$now));
                    
        $intEndDate mktime(235959date("m",$now), date("d",$now)+1date("Y",$now));
                    break;
                case 
        "last14":  // die letzten VERGANGENEN 14 Tage (bis heute 23_59:59)
                    
        $intStartDate mktime(000date("m",$now), date("d",$now)-14date("Y",$now));
                    
        $intEndDate mktime(235959date("m",$now), date("d",$now)+1date("Y",$now));
                    break;
                case 
        "thismonth"// 1. Tag des Monats bis heute 23:59:59
                    
        $intStartDate mktime(000date("m",$now), 1date("Y",$now));
                    
        $intEndDate mktime(235959date("m",$now), date("d",$now)+1date("Y",$now));
                    break;
                case 
        "threemonth"// letzte 2 Monate bis heute
                    
        $monat date(m);
                    
        $jahr date(Y);
                    if (
        $monat == 1) {$monat2 11$jahr2 $jahr 1;};
                    if (
        $monat == 2) {$monat2 12$jahr2 $jahr 1;};
                    
        $intStartDate mktime(000$monat21$jahr2);
                    
        $intEndDate mktime(23,59,59,date("m",$now),date("d",$now)+1,date("Y",$now));
                    break;
                case 
        "sixmonth"// letzten 5 Monate bis heute
                    
        $monat date(m);
                    
        $jahr date(Y);
                    if (
        $monat == 1) {$monat2 8$jahr2 $jahr 1;};
                    if (
        $monat == 2) {$monat2 9$jahr2 $jahr 1;};
                    if (
        $monat == 3) {$monat2 10$jahr2 $jahr 1;};
                    if (
        $monat == 4) {$monat2 11$jahr2 $jahr 1;};
                    if (
        $monat == 5) {$monat2 12$jahr2 $jahr 1;};
                    
        $intStartDate mktime(000$monat21$jahr2);
                    
        $intEndDate mktime(23,59,59,date("m",$now),date("d",$now)+1,date("Y",$now));
                    break;
                case 
        "thisyear":  // Anfang des Jahres bis heute 23:59:59
                    
        $intStartDate mktime(0,0,0,1,1,date("Y",$now));
                    
        $intEndDate mktime(23,59,59,date("m",$now),date("d",$now)+1,date("Y",$now));
                    break;
                default:
                    return 
        FALSE;
            }
            
        $arrErg["start"] = $intStartDate;
            
        $arrErg["end"] = $intEndDate;
            return 
        $arrErg;

        So klappt es nun einwandfrei.

        Danke nochmal.
        Sayon
        Zuletzt geändert von Sayon; 30.01.2004, 17:27.

        Kommentar

        Lädt...
        X