Geburtstage der vergangenen/nächsten 30 Tage

  • Hallo,

    ich habe ein php-Script welches mir die Geburtstage der vergangenen und nächsten 30 Tage anzeigt. Funktioniert soweit auch ganz gut - bis ich nun im Dezember festgestellt habe, dass das bei Jahreswechsel nicht funktioniert.



    Das Feld Geburtstag hat das Format "1970-12-24 12:23:54".

    Wenn ich die Anzahl der Tage der kommenden Geburtstage auf z.B. 28 Tage begrenze (also für heute 2+28) dann funktioniert es auch.


    Es ist also erichtlich, dass es am Jahresübergang liegt.


    Hat vielleicht jemand einen Tipp für mich ?


    VG

    rs



  • Da dein Problem im Dezember auftritt liegt es nahe zu vermuten, dass das Jahr relevant für die Lösung ist. Du gibst "%m%d", also Monat und Tag mit. Hast du einmal versucht hier auch das Jahr (%Y) einzusetzen.

    Hallo Astrid,

    richtig: die Vermutung liegt sehr nahe, dass es am Jahreübergang liegt - so hatte ich es auch schon oben geschrieben.

    Ich habe div. Varianten mit %Y probiert - entweder wird garnichts mehr angezeigt oder das komplette Script schlägt fehlt und die Seite zeigt einen Fehler.


    Zur Info:

    Ich bin ja auch nicht der Verfasser der Abfrage, sondern habe es damals über google gefunden und es für mich angepasst. Meine php/SQL-Query-Kenntnisse sind doch eher rudimentär.


    Habe auch schon viel bei Tante Google geforscht, dieses Problem scheinen wohl div. Leute zu haben, aber eine Lösung habe ich leider noch nicht gefunden.


    Ich denke, hier müsste ein echte Query-Experte dran.


    Trotzdem danke.


    VG

    rs

  • Habe nun was gefunden was geht :-).

    Zu finden unter: https://www.codehaven.co.uk/my…thday-next-30-days-mysql/


    Code
    select * from users 
    where ( month(date_of_birth) > month(CURDATE()) 
     and month(date_of_birth) < month(ADDDATE(CURDATE(),30)) ) 
     or ( month(CURDATE()) = month(date_of_birth) and day(date_of_birth) >= day(CURDATE()) 
     or month(ADDDATE(CURDATE(),30)) = month(date_of_birth) and day(date_of_birth) <= day(ADDDATE(CURDATE(),30)) ) 
     or ( year(CURDATE()) > year(ADDDATE(CURDATE(),30)) and month(date_of_birth) < month(CURDATE()) and month(date_of_birth) > month(ADDDATE(CURDATE(),30)) )

    Muss man nur noch anpassen und dann geht es.


    VG

  • Probier einmal das für die "kommenden" Geburtstage:


    Code
    DATE_ADD(geburtstag, INTERVAL YEAR(CURDATE())-YEAR(geburtstag) + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(geburtstag),1,0) YEAR) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)

    Also:


    Code
    $query = "SELECT * FROM #__users_details WHERE DATE_ADD(geburtstag, INTERVAL YEAR(CURDATE())-YEAR(geburtstag) + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(geburtstag),1,0) YEAR) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)AND (verstorben_status = '0')) ORDER BY MONTH(geburtstag),DAY(geburtstag)";


    Getestest ist es nicht. Die Idee ist die Jahresdifferenz anzupassen.

  • astrid:

    hat bei mir leider nicht geklappt.


    Hier jedoch die Lösung, die bei mirgeht:

    Code
    $query = "SELECT * FROM #__users_details WHERE 
                ( month(geburtstag) > month(CURDATE()) 
                 and month(geburtstag) < month(ADDDATE(CURDATE(),30)) ) 
                 or ( month(CURDATE()) = month(geburtstag) and day(geburtstag) >= day(CURDATE()) 
                 or month(ADDDATE(CURDATE(),30)) = month(geburtstag) and day(geburtstag) <= day(ADDDATE(CURDATE(),30)) ) 
                 or ( year(CURDATE()) > year(ADDDATE(CURDATE(),30)) and month(geburtstag) < month(CURDATE()) and month(geburtstag) > month(ADDDATE(CURDATE(),30)) ) 
                 ORDER BY MONTH(geburtstag) DESC,DAY(geburtstag) ASC"; 
  • hat bei mir leider nicht geklappt.

    Für den Jahreswechsel habe ich es gerade mit Beispieldaten getestet. Das funktioniert bei mir. Was hat bei dir genau nicht funktioniert?



    Hier jedoch die Lösung, die bei mir geht:


    Ich habe mir dein Beispiel angesehen. Warum nutzt du den ersten Oder-Teil.

    Code
    ...(
    month(geburtstag) > month(CURDATE())
    and
    month(geburtstag) < month(ADDDATE(CURDATE(),30))
    )...

    Das ist immer false, oder übersehe ich etwas?

  • Für den Jahreswechsel habe ich es gerade mit Beispieldaten getestet. Das funktioniert bei mir. Was hat bei dir genau nicht funktioniert?


    Ich bekomme die folgende Fehlermeldung.

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY MONTH(geburtstag),DAY(geburtstag)' at line 1


    Lokal zum Testen nutze ich MAMP (aktuelle Version, mit mySQL 5.7.26), im "echten Leben" ist es mySQL 5.6.42-log.


    Ich finde leider keinen Fehler, deswegen konnte ich Deine Version nicht nutzen.



    Warum nutzt ich den ersten Oder-Teil nutze, kann ich Dir leider nicht sagen :-). Habe das SQL-Query so im Netz gefunden und es ausgetstet.

    Meine SQL-Query-Kenntnisse reichen nicht aus umd das Statement zu verstehen - sorry.

  • Da ist ein ')' zuviel oder ein '(' zuwenig drin:

    $query = "SELECT * FROM #__users_details WHERE DATE_ADD(geburtstag, INTERVAL YEAR(CURDATE())-YEAR(geburtstag) + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(geburtstag),1,0) YEAR) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)AND (verstorben_status = '0')) ORDER BY MONTH(geburtstag),DAY(geburtstag)";


    Liebe Grüße, Gerald