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

  • #16
    Dann würde ich MAKEDATE(year,dayofyear) und wie schon beschrieben BETWEEN verwenden.

    WHERE MAKEDATE(Year(Curdate()), sp_kunde_geburstag_doy) BETWEEN Now() AND Now()+Interval 7 day

    Kommentar


    • #17
      Nach nochmaligen Nachlegen würde ich das doch anders lösen.
      Den Übertrag ins nächste Jahr würde ich als Sonderbehandlung einbauen. Also ab Tag 359 eine Betrachtung der ersten Tage des Jahres, sonst ein einfacher Vergleich auf den Zahlenwert. Vorteil: In der Mehrzahl der Fälle kann mysql das komplett aus dem Index ziehen ohne weitere Berechnungen/Full_table_scan.

      Oder ich würde ein Feld "nächster Geburstag" mit einem mysql-Datumswert mitpflegen. Abgelaufene Geburstage lassen sich leicht ermitteln und aktualisieren. Das dann allerdings jeweils aus dem ursprünglichen Geburstag. Das ist zwar etwas mehr Berechnung als ein simples "+1 Jahr", macht dafür aber keine Probleme bei den Spezialnasen, die ausgerechnet am 29.2 geboren wurden. Vorteil: Die gesamte Palette an mysql-Datumsfunktionen steht Dir offen für allerlei Spielereien

      Kommentar


      • #18
        @jahudie:
        Wenn du das Problem inzwischen noch nicht gelöst hast,
        teste folgendes Script:
        Code:
        <?php
        
        $vonTS = time();   // heute
        
        
        // Dauer des AbfrageZeitraums 'vor' und 'nach' heute definieren:
        
        $minusTage = 7;
        $plusTage  = 14;
        
        // die Variablen $vonMD , $bisMD und $where werden für die SQL-Abfrage benötigt:
        
        $bisMD = date("md", strtotime("+$plusTage day", $vonTS));
        
        $vonMD = date("md", strtotime("-$minusTage day", $vonTS));
        
        IF ($vonMD == "0301" && date("z",strtotime("-$minusTage day", $vonTS)) == 59)
        {
           $vonMD = "0229";
        }
        
        IF ($vonMD <= $bisMD)
        {
           $where = " ( DATE_FORMAT(geburtstag, '%m%d') BETWEEN '$vonMD' AND '$bisMD') ";
        }
        else
        {
           $where = " ( DATE_FORMAT(geburtstag, '%m%d') >= '$vonMD'
                        OR
                        DATE_FORMAT(geburtstag, '%m%d') <= '$bisMD' ) ";
        
        }
        
        $sql = "
        SELECT
           geburtstag
        FROM
           tabelle
        WHERE
           $where
        ORDER BY
           DATE_FORMAT(geburtstag, '%m%d') < '$vonMD',
           DATE_FORMAT(geburtstag, '%m%d')
        ";
        
        echo "<hr> $sql <hr>";
        
        // hier dann die DB connecten und die Abfrage absetzen!
        
        ?>
        Bei diesem Script wird keine 'Jahreszahl' benötigt!
        Ein Jahreswechel innerhalb des abzufragenden Zeitraums wird berücksichtig.
        Das 'Schalttag-Problem' ist behoben!

        Nach meinen Test funktioniert das Script korrekt.

        mfG ~dilemma~

        Kommentar


        • #19
          Hab dein Script jetzt nicht komplett mit durchdacht, aber warum testest du nochmal auf den 1. März, den 29. Februar müsste strtototime(-7 days) doch schon berücksichtigt haben oder?

          Kommentar


          • #20
            Ausserdem rate ich von WHERE DATE_FORMAT... ORDER BY DATE_FORMAT bei großen Datenmengen ab. Da kann mysql keinen Index für benutzen.
            Lieber beim Schreiben (seltener) etwas mehr Aufwand betreiben und dafür beim Lesen (wesentlich öfter) einfache Auswertung betreiben.
            Deshalb würde ich mir wohl wirklich das Feld "nächster Geburstag" ans Bein binden.

            Kommentar


            • #21
              @Bruchpilot:

              Vielleicht genügt es ja auch,
              in der entsprechenden Tabelle
              eine zusätzliche Spalte `geburtstagMMDD` einzufügen,
              die von den kompletten Geburtsdatum
              nur den Teil ---> DATE_FORMAT(geburtstag, '%m%d')
              aufnimmt.

              Dann wäre diese Spalte doch indexierbar(?),
              und die von mir vorgeschlagene SQL-Abfrage
              wäre dann doch ganz einfach anzupassen.

              Sinngemäß so:
              ---> $where = " ( geburtstagMMDD BETWEEN '$vonMD' AND '$bisMD') ";

              ~dilemma~

              Kommentar


              • #22
                Klar, das geht. Bleibt noch die Fallunterscheidung für das Jahresende.
                Sicher nicht weiter wild, aber ich würde es halt über das zu pflegende Extrafeld lösen. Gerade, weil mysql so starke Datumsfunktionen hat. Wenn darüber eine WHERE oder ORDER BY Klausel aufgebaut wird, ist das nicht so toll. Aber wenn schon unabhängig davon eingegrenzt wurde und "nur" noch Umformungen stattfinden, ist es meist schneller, als wenn es das drumherumliegende Programm vornimmt.
                Z.B. "Wieviele Tage bis zum Geburstag von Benutzer xyz" -> SELECT DATEDIFF(Now(),nächsterGeburstag) ...
                usw usw

                Kommentar

                Lädt...
                X