Ankündigung

Einklappen
Keine Ankündigung bisher.

Datumssortierung ohne Einbeziehung von Jahr (Geburtstage)

Einklappen

Neue Werbung 2019

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

  • Datumssortierung ohne Einbeziehung von Jahr (Geburtstage)

    Hallo Community,

    habe ein problem das ich schon ewig versuche selber zu l�sen, aber irgendwann sollte man einfach fragen ... da muss es doch eine einfache lösung geben.

    Vorab: Habe eine Mysql Tabelle auf die ich per PHP zugreife.

    In der Tabelle habe ich ein Feld des Typs DATE mit dem Namen "sp_kunde_gebdatum".

    In meiner PHP Datei moechte ich das heutige Datum an die Abfrage übergeben.

    Die MYSQL Anweisung soll mir bei definition des aktuellen Datums alle Geburtstagskinder von letzter bis uebernaechster Woche ausgeben.


    BEISPIEL:
    Heute : 22.Dezember 2005.
    Benötigt : Geburtstage vom
    15. Dezember 2005
    bis
    5. Januar 2006

    Zu beruecksichtigen ist hierbei ein Jahreswechsel (bei dem scheiterts bei mir)

    Waere genial, wenn mir jemand dabei helfen koennte.

    thx

  • #2
    hier ein 'Fundstück' , das zu funktionieren scheint:
    Code:
    <?php
    
    $tage = 365; // Abfragezeitraum festlegen
    
    $vonTS = time(); // = heute
    
    /* oder:
    $vonTS = mktime(0,0,0,3,1,2005); // ein definiertes Startdatum
    */
    
    // letztes Abfragedatum definieren:
    $bisTS = mktime(0,0,0,date("m", $vonTS), date("d", $vonTS) + $tage, date("Y", $vonTS));
    
    $vonJahr = date("Y", $vonTS);
    $bisJahr = date("Y", $bisTS);
    
    
    // Schalttag berücksichtigen:
    $vonMD = (date("md",$vonTS) == "0301" && date("z",$vonTS) == 59) ? "0229" : date("md",$vonTS);
    
    // die Daten in das Format "yyyymmdd" formatieren:
    
    $vonDatum = $vonJahr.$vonMD;
    $bisDatum = date("Ymd", $bisTS);
    
    
    $query =
    "
    SELECT
       id, geburtstag, DATE_FORMAT(geburtstag, '%d. %M') AS xday
    FROM
       tabelle
    WHERE
       CONCAT('$vonJahr', DATE_FORMAT(geburtstag, '%m%d')) BETWEEN '$vonDatum' AND '$bisDatum'
    ";
    
    if($bisJahr > $vonJahr)
    {
       $query .= "
       OR
       CONCAT('$bisJahr', DATE_FORMAT(geburtstag, '%m%d')) BETWEEN '$vonDatum' AND '$bisDatum' ";
    }
    
    $query .=
    " ORDER BY
       DATE_FORMAT(geburtstag, '%m%d') < '$vonMD',
       DATE_FORMAT(geburtstag, '%m%d')
    ";
    
    echo "<hr> $query <hr>";
    
    ?>
    ~dilemma~
    ohne weiteren Kommentar,
    weil nicht von mir,
    und nur kurz getestet (,aber nicht eingesetzt!).

    Kommentar


    • #3
      Das Ganze sollte sich wesentlich einfacher mit dieser Abfrage lösen lassen:
      Code:
      ...
      WHERE
          sp_kunde_gebdatum BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND DATE_ADD(NOW(), INTERVAL 7 DAY)

      Kommentar


      • #4
        Habe gerade schon folgendes ausfindig gemacht:


        Code:
        SELECT sp_kunde_nachname, sp_kunde_gebdatum FROM sp_kunde
           WHERE MONTH(sp_kunde_gebdatum) = 
        MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH))
        or
        MONTH(sp_kunde_gebdatum) = MONTH(DATE_ADD(NOW(), INTERVAL -1 MONTH))
        or
        MONTH(sp_kunde_gebdatum) = MONTH(NOW())
        Damit erhält man die Birthdays vom letztne, aktuellen und kommenden Monat.
        probiere gleich mal den code von euch aus.

        Kommentar


        • #5
          @xabbuh:

          deine Version liefert
          wer innerhalb der letzten 7 Tage geboren wurde,
          oder innerhalb der nächsten 7 Tage geboren wird.

          Oder denke ich da falsch???

          ~dilemma~

          @jahudie:
          Deine Version funktioniert nur dann,
          wenn INTERVAL 1 Monat ist,
          sonst nicht!

          ~dilemma~

          Kommentar


          • #6
            Eigentlich ist der Ansatz von xabbuh perfekt.
            Allerdings berücksichtigt dieser die Geburtsjahre und natürlich hat niemand seinen geburtsag heute ! 22.11.2005

            Kommentar


            • #7
              Genau. Ist zwar sehr ungenau. aber immerhin kriege ich nicht gleich alles Geburtstage.

              Allerdings muss man doch auch die Jahre in dem Script von dilemma angeben ? oder ?

              Kommentar


              • #8
                Zitat von dilemma
                deine Version liefert
                wer innerhalb der letzten 7 Tage geboren wurde,
                oder innerhalb der nächsten 7 Tage geboren wird.
                Stimmt, das hatte ich nicht berücksichtigt.

                Richtig wäre es wohl so:
                Code:
                ...
                WHERE
                    CONCAT_WS('-', YEAR(NOW()), MONTH(sp_kunde_gebdatum), DAYOFMONTH(sp_kunde_gebdatum)) BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND DATE_ADD(NOW(), INTERVAL 7 DAY)

                Kommentar


                • #9
                  Dieser Vorschlag ist nicht korrekt:
                  ...
                  WHERE
                  CONCAT_WS('-', YEAR(NOW()), MONTH(sp_kunde_gebdatum), DAYOFMONTH(sp_kunde_gebdatum))
                  ...
                  weil:
                  für `sp_kunde_gebdatum` = '1900-09-09'
                  wird
                  durch die o.g. Funktion zB das Datum "2005-9-9"
                  generiert.
                  Code:
                  Dieses Datum "2005-9-9" ist nicht
                  ---> BETWEEN "2005-01-01"
                           AND "2005-12-31"!
                  ~dilemma~

                  Kommentar


                  • #10
                    Da hast du wohl Recht... Dann müsste man das ganze Konstrukt wohl noch so erweitern, dass die Rückgabewert von MONTH() und DAYOFMONTH() wenn notwendig mit LPAD() auf 2 Zeichen erweitert werden.

                    Kommentar


                    • #11
                      Sehe ich es richtig, das diese Abfrage von - xabbuh - für alle die Kunden, die nach 1910 geboren wurden, funktinionieren würde ?

                      Denn die Datenbank wird über 60 Jährige auf garkeinen Fall erfassen müssen!

                      Kommentar


                      • #12
                        Vergleiche doch einfach die DAYOFYEAR()-Werte.
                        Oder bei einer großen Menge an Kunden noch besser: Halte den DAYOFYEAR-Wert in einem eigenen Feld fest. Der Geburstag wird so wohl nicht so häufig ändern und Du kannst einen Index für die Sortierung über das Feld legen.

                        http://dev.mysql.com/doc/refman/5.0/...functions.html

                        Kommentar


                        • #13
                          @Bruchpilot

                          die DAYOFYEAR()-Werte sind schon ein guter Ansatz. Allerdings bekommt man ab Dezember keine Januar Werte mehr.

                          Aber ich möchte ja Jahresübergreifend auf die Daten zugreifen.
                          Also ist eine Lösung mit DAYOFYEAR() nicht möglich.

                          Kommentar


                          • #14
                            Bitte genauer erklären. Mir unklar.
                            Du willst doch eine Sortierung über die Geburstage ohne Jahresangaben haben. Was interessiert Dich dann im Dezember noch der Januar? Der ist lange vorbei und schon längt sortiert.

                            Edit: Quatsch. Ich hab mir den ersten Post jetzt erst durch gelesen. Das hier einfach ignorieren.

                            Kommentar


                            • #15
                              BEISPIEL:
                              Heute : 22.Dezember 2005.
                              Benoetigt : Geburtstage vom
                              15. Dezember 2005
                              bis
                              5. Januar 2006

                              Also ca. 7 Tage ab heute zurück und 14 Tage in die Zukunft.

                              Kommentar

                              Lädt...
                              X