split.s: mysql: Personen anzeigen, die mindestens 30 jahre alt sind.

Ich hab eine DATE-Spalte mit einem Geburtsdatum.
Ich wollte mir alle Personen anzeigen lassen, die mindestens 30 Jahre alt sind.
Mein Anfang war jetzt folgender:

... WHERE YEAR(CURDATE())-YEAR(geburtstag) <= 30

Hier hab ich aber das Problem, dass die Ausgabe nicht exakt ist.

Wie würdet ihr das machen?
Ich hatte schon überlegt 30+1 zu machen, aber dann bekomme ich auch Personen, die heute 31 geworden sind.

  1. Moin!

    Ich hab eine DATE-Spalte mit einem Geburtsdatum.
    Ich wollte mir alle Personen anzeigen lassen, die mindestens 30 Jahre alt sind.
    Mein Anfang war jetzt folgender:

    ... WHERE YEAR(CURDATE())-YEAR(geburtstag) <= 30

    Hier hab ich aber das Problem, dass die Ausgabe nicht exakt ist.

    Wenn du vom heutigen Datum 30 Jahre abziehst, erhältst du das Datum vor dreißig Jahren, an dem Leute geboren wurden, die heute ihren dreißigsten Geburtstag feiern. Alle Personen, die noch früher geboren wurden, sind älter als 30 Jahre.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Aber damit wiederholst du mich ja nur.
      Das Problem ist doch, wenn ich 31 abziehe, dann erhalte ich zwar auch alle 30 jährigen, aber auch diejenigen, die heute ihren 31. feiern.

      1. echo $begrüßung;

        Aber damit wiederholst du mich ja nur.

        Der Unterschied zwischen deiner Implementation und seinem Vorschlag ist Jahr versus Tag.

        echo "$verabschiedung $name";

      2. Moin!

        Aber damit wiederholst du mich ja nur.
        Das Problem ist doch, wenn ich 31 abziehe, dann erhalte ich zwar auch alle 30 jährigen, aber auch diejenigen, die heute ihren 31. feiern.

        Du sollst vom DATUM 30 Jahre abziehen, nicht vom JAHR. Und dann das DATUM vergleichen, nicht das JAHR.

        Da gibts extra Datumsrechenfunktionen in MySQL.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hmmmm...

          Da ich die befürchtung habe, dass es noch einfacher geht, zeige ich euch mal hier meinen Ansatz:

            
          SELECT name FROM users WHERE birthday <= SUBSTR(DATEDIFF(CURDATE(), geburtstag)/365,1,2)  
          
          

          Was haltet ihr davon?
          Hättet ihr es auch so gemacht?

          1. Moin!

            Da ich die befürchtung habe, dass es noch einfacher geht, zeige ich euch mal hier meinen Ansatz:

            Da sehe ich nichts von dem, was ich dir geraten hatte.

            Ich schrieb initial:

            Wenn du vom heutigen Datum 30 Jahre abziehst, erhältst du das Datum vor dreißig Jahren, an dem Leute geboren wurden, die heute ihren dreißigsten Geburtstag feiern. Alle Personen, die noch früher geboren wurden, sind älter als 30 Jahre.

            Oder mal "programmierter" ausgedrückt:

            Nimm alle User, bei denen das Geburtsdatum kleiner oder gleich (Heute - 30 Jahre) ist.

            Wie du die Rechenaufgabe in SQL umsetzt, überlasse ich dir. Die Manual-Seite mit den Datumsrechenfunktionen hast du anscheinend schon gefunden, sonst würdest du DATEDIFF nicht verwendet haben.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
          2. echo $begrüßung;

            Da ich die befürchtung habe, dass es noch einfacher geht, zeige ich euch mal hier meinen Ansatz:
            SELECT name FROM users WHERE birthday <= SUBSTR(DATEDIFF(CURDATE(), geburtstag)/365,1,2)
            Was haltet ihr davon?

            Wenn ich dir jetzt sagte, dass man beispielsweise mit SELECT DATE_SUB(CURRENT_DATE(), INTERVAL 30 YEAR) den 4.7.1978 erhält, und dabei auch noch alle Schaltjahre korrekt berücksichtigt wurden, dann hätte ich dir schon die Lösung gegeben. Du bräuchtest dann nicht mehr die Handbuchseite zu den Datums- und Zeitfunktionen nach einer Lösung zu durchsuchen. Allerdings ginge dir dabei eine Gelegenheit verloren, dir einen Überblick über die vorhandenen Funktionen zu verschaffen oder ihn zu vertiefen. Und deswegen gehe ich dir nur erneut den Link zum Handbuch: Date and Time Functions und die Empfehlung die Stringfuntionen und feste Zeiteinheiten (365 Tage/Jahr; 86400 Sekunden/Tag) bei der Datumsberechnung zu vermeiden. Rechne stattdessen mit konkreten "Datümern" und den dafür vorgesehenen Funktionen.

            echo "$verabschiedung $name";

            1. DATE_SUB()  hatte ich schonmal probiert, aber mit demselben Problem!

              Hier mein Statement:

                
              SELECT name FROM users WHERE geburtstag >= DATE_SUB(CURDATE(), INTERVAL 25 YEAR)  
              
              

              Nochmal zur Errinnerung:
              Ich will nur diejenigen anzeigen, die jünger oder gleich 25 sind!
              ICH bin 25 und ich werde nicht von WHERE erfasst!
              Erst wenn ich 25 durch 26 ersetze funktioniert es auch für mich. Aber ich bin halt 25 und nicht 26 ;)

              1. Yerf!

                Nochmal zur Errinnerung:
                Ich will nur diejenigen anzeigen, die jünger oder gleich 25 sind!
                ICH bin 25 und ich werde nicht von WHERE erfasst!

                *Exakt* 25 oder doch schon etwas älter?

                Erst wenn ich 25 durch 26 ersetze funktioniert es auch für mich. Aber ich bin halt 25 und nicht 26 ;)

                Nimm 26 und wirf das Gleichheitszeichen aus dem Select, dann sollte das passen und alle liefern die gerade noch nicht 26 sind.

                Gruß,

                Harlequin

                --
                <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
      3. Mahlzeit split.s,

        Das Problem ist doch, wenn ich 31 abziehe, dann erhalte ich zwar auch alle 30 jährigen, aber auch diejenigen, die heute ihren 31. feiern.

        Du kennst den Unterschied zwischen "<" und "<="?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|