sulu: mysql: aus DATE Alter ermitteln?

Hey ihrs

kann ich eigentlich auch unabhängig von irgendeinem Script mit SQL aus einer DATE Spalte ein Alter ermitteln?
Schaltjahre etc. werden ja vermutlich von mySQL unterstützt (korrigiert mich wenn ich falsch liege).

Hat jemand eine idee wie man sowas umsetzen könnte?

  1. Hat jemand eine idee wie man sowas umsetzen könnte?

    http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html

    datediff (ist aber ein wenig heiss ;)
    period_diff (schon besser)
    eventuell auch to_days()

    Mein Favorit zurzeit: period_diff

    1. Hat jemand eine idee wie man sowas umsetzen könnte?

      http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html

      datediff (ist aber ein wenig heiss ;)
      period_diff (schon besser)
      eventuell auch to_days()

      Mein Favorit zurzeit: period_diff

      Äh ich hab übrgens vergessen: Suche das Alter in JAHREN !
      DATEDIFF liefert nur die Tage :(

      1. Hat jemand eine idee wie man sowas umsetzen könnte?

        http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html

        datediff (ist aber ein wenig heiss ;)
        period_diff (schon besser)
        eventuell auch to_days()

        Mein Favorit zurzeit: period_diff

        Äh ich hab übrgens vergessen: Suche das Alter in JAHREN !
        DATEDIFF liefert nur die Tage :(

        Mit period_diff() kriegst Du die Monate, was doch ausreicht:
        1 Jahr = mdst. 12 Monate, wobei Du auch die Schaltjahresproblematik gelöst hast (sofern in MySQL richtig implementiert ;)

        1. Habs jetzt so gemacht:

            
          SELECT PERIOD(CURDATE(), geburtstag)/12) AS jahre  
          
          

          Jetzt bekomme ich aber sowas hier z.B.:
          2502.67
          2496.58

          Die forderen zwei Ziffern sind das Alter, das ist schonmal ersichtlich.
          Aber wie bekomme ich das da raus?

          1. Habs jetzt so gemacht:

            SELECT PERIOD(CURDATE(), geburtstag)/12) AS jahre

            
            >   
            > Jetzt bekomme ich aber sowas hier z.B.:  
            > 2502.67  
            > 2496.58  
              
            Die von mir empfohlene Funktion ist leider ungeeignet, mir entging die schwer fassbare Parametriesierung der Funktion, Tagesangaben werden ignoriert.   LOL  
            Kaum fassbar, aber ich finde auf die Schnelle keine bessere Lösung als den Mist, den Vinnie verlinkt hat.  
            Da hacke noch einer auf MS herum (die haben vernünftige Datums-/Zeitfunktionen), wenn MySQL so etwas bietet.
            
            1. Eventuell geht was mit TIMEDIFF(expr,expr2), vgl. auch http://photomatt.net/2003/12/08/calculate-age-in-mysql/, alles nicht sehr vertrauenserweckend.

              Vielleicht hier irgendwas:
              http://www.google.de/search?hl=de&q=calculate+age+mysql&meta=

              1. Hallo King,

                Eventuell geht was mit TIMEDIFF(expr,expr2), vgl. auch http://photomatt.net/2003/12/08/calculate-age-in-mysql/, alles nicht sehr vertrauenserweckend.

                doch, doch. Das von Dir verlinkte ist prinzipiell nichts anderes als der erste Benutzerkommentar. Photo Matts erster Kommentar, der hier von Tobias wiedergegeben wird, habe ich ja mit einem anderen Beispiel als Photo Matt selbst widerlegt. Solche Tagesrechnereien scheitern _immer_ an den Schaltjahren - es sei denn, man berücksichtigt die doch recht komplizierten Regeln.

                Und das ist Blödsinn. Die Frage läuft stets darauf hinaus: Hatte die Person im aktuellen Jahr bereits Geburtstag

                Wenn die Person im aktuellen Jahr bereits Geburtstag hatte
                    Alter = Differenz der beiden Jahresanteile
                Sonst
                    Alter = Differenz der beiden Jahresanteile - 1
                Ende Wenn

                Das Problem ist damit reduziert auf die Feststellung: Ist der Geburtstag in diesem Jahr bereits erreicht.

                Formatiert man den Monats- und Tagesanteil der beiden Datumsangaben in der Form

                MMDD

                so ist dies mit einem einfachen Vergleich erledigt. Dabei ist es unerheblich, ob der Monats- und Tagesanteil als Zeichenkette oder als Ganzzahl betrachtet wird.

                Nichts anderes erfolgt im ersten Benutzerkommentar. Dieser verkompliziert die Sache nur dadurch, dass er noch berücksichtigt, dass date1 > date2 sein kann oder umgekehrt. Diesen Fall läßt Photo Matt außen vor.

                Freundliche Grüße

                Vinzenz

                1. Eventuell geht was mit TIMEDIFF(expr,expr2), vgl. auch http://photomatt.net/2003/12/08/calculate-age-in-mysql/, alles nicht sehr vertrauenserweckend.

                  doch, doch. Das von Dir verlinkte ist prinzipiell nichts anderes als der erste Benutzerkommentar.

                  OK, halten wir fest, dass

                    
                  SELECT  
                   DATE_FORMAT(NOW(), '%Y') -  
                   DATE_FORMAT(dob, '%Y') -  
                   (DATE_FORMAT(NOW(), '00-%m-%d') > DATE_FORMAT(dob, '00-%m-%d'))  
                   AS age  
                  
                  

                  die einzig coole Lösung ist (sofern der letzte Vergleich, falls wahr, auch -1 liefert ;).
                  ("Cool" in Anführungszeichen denken, meinen Ärger über die Datumsfunktionen von MySQL habe ich ja schon zu Ausdruck gebracht.)

  2. Hallo

    kann ich eigentlich auch unabhängig von irgendeinem Script mit SQL aus einer DATE Spalte ein Alter ermitteln?
    Hat jemand eine idee wie man sowas umsetzen könnte?

    Ja, das MySQL-Handbuch: http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
    Schau' Dir den ersten Benutzerkommentar an ...

    Freundliche Grüße

    Vinzenz

    1. Schau' Dir den ersten Benutzerkommentar an ...

      IF((YEAR(date2) - YEAR(date1)) > 0, (YEAR(date2) - YEAR(date1)) - (MID(date2, 6, 5) < MID(date1, 6, 5)), IF((YEAR(date2) - YEAR(date1)) < 0, (YEAR(date2) - YEAR(date1)) + (MID(date1, 6, 5) < MID(date2, 6, 5)), (YEAR(date2) - YEAR(date1))))

      ist ja wohl verglichen mit

      SELECT
       PERIOD_DIFF(date1,date2)/12 as Alter

      etwas uncool.

      1. finde das Beispiel mit PERIOD_DIFF auch besser.
        Aber das Ergebnis ist vom PERIOD_DIFF-Beispiel ist 2502.68

  3. yo,

    Hat jemand eine idee wie man sowas umsetzen könnte?

    der erste schritt die jahre des geburtsdatum mit dem heutigen jahr verrechnen.

    select DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(datums_spalte, '%Y')
    FROM tabelle

    danach muss man nur noch darauf achten, ob die betroffenen person schon in dem jahr geburstag hatte oder nicht. wenn nicht, dann ein jahr abziehen.

    select DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(datums_spalte, '%Y')-
    IF(DATE_FORMAT(NOW(), '%c') < DATE_FORMAT(datums_spalte, '%c') OR
       DATE_FORMAT(NOW(), '%c') = DATE_FORMAT(datums_spalte, '%c') AND
       DATE_FORMAT(NOW(), '%e') <= DATE_FORMAT(datums_spalte, '%e'), 0, 1
      )
    FROM tabelle

    Ilja

  4. Hallo,

    Hat jemand eine idee wie man sowas umsetzen könnte?

    Ja: http://www.to-kl.de/scripte/mysql-schnipsel.html (die ersten zwei Punkte)

    Grüße aus Nürnberg
    Tobias

    1. Hat jemand eine idee wie man sowas umsetzen könnte?
      Ja: http://www.to-kl.de/scripte/mysql-schnipsel.html (die ersten zwei Punkte)

      YEAR(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(geburtsdatum)+1))

      Bist Du sicher, dass das immer richtig resultiert?

    2. Hallo Tobias,

      Hat jemand eine idee wie man sowas umsetzen könnte?
      Ja: http://www.to-kl.de/scripte/mysql-schnipsel.html (die ersten zwei Punkte)

      sorry, aber die erste Formel ist leider falsch :-(

      Beweis:
      SELECT YEAR(FROM_DAYS(TO_DAYS('2003-02-27') - TO_DAYS('2000-02-28') + 1))
      -> 3

      Nein, versuche bitte nicht, irgendwie noch 1 zu subtrahieren oder sonst etwas zu machen. Dieser Codeschnipsel berücksichtigt nicht die exakte Lage des Schalttages.

      Zum von mir angeführten Beispiel in den Benutzerkommentaren möchte ich nur den
      Kommentar abgeben, dass ich persönlich MONTH() und DAY() als verständlicher
      gegenüber MID() bevorzuge.

      Freundliche Grüße

      Vinzenz

      1. Hallo Vinzenz,

        sorry, aber die erste Formel ist leider falsch :-(
        Beweis:
        SELECT YEAR(FROM_DAYS(TO_DAYS('2003-02-27') - TO_DAYS('2000-02-28') + 1))
        -> 3

        Stimmt, in dem speziellen Fall stimmt das Ergebnis nicht - allerdings ist dieser Fall sehr selten, die Methode mit dem TO_DAYS liefert bei allen über 700 Mitgliedern in meiner Datenbank das richtige Ergebnis. Prinzipiell ist es aber imho zu verschmerzen, wenn die Funktion in seltenen Fällen um einen Tag daneben liegt.

        Zum von mir angeführten Beispiel in den Benutzerkommentaren möchte ich nur den
        Kommentar abgeben, dass ich persönlich MONTH() und DAY() als verständlicher
        gegenüber MID() bevorzuge.

        Das Beispiel in den Benutzerkommentaren ist auch nicht perfekt - es liefert heute gleich 15 Fehler (alle die zwischen dem 25.5. und dem 31.5. Geburtstag haben) da es nicht berücksichtigt, ob jemand im aktuellen Monat schon Geburtstag hatte oder nicht. Ich habe den Query aus dem Benutzerkommentaren mal um die Berücksichtigung des Tages ergänzt (und das IF-Zeugs weggelassen):

        SELECT ((YEAR('2003-02-27') - YEAR('2000-02-28')) - (MONTH('2003-02-27') < MONTH('2000-02-28')) -  
         (DAYOFMONTH('2003-02-27') < DAYOFMONTH('2000-02-28') AND MONTH('2003-02-27') = MONTH('2000-02-28')))
        

        -> 2

        (DAY() ist nur ein Synonym für DAYOFMONTH() und existiert erst ab MySQL 4.1, deswegen habe ich letzteres verwendet)

        Grüße aus Nürnberg
        Tobias

        1. Stimmt, in dem speziellen Fall stimmt das Ergebnis nicht - allerdings ist dieser Fall sehr selten,

          So ist es mit Dosom und Mogorrha auch angefangen.

          die Methode mit dem TO_DAYS liefert bei allen über 700 Mitgliedern in meiner Datenbank das richtige Ergebnis. Prinzipiell ist es aber imho zu verschmerzen, wenn die Funktion in seltenen Fällen um einen Tag daneben liegt.

          Wenn der Nutzer Fehlertoleranz hinzu gebaut hat und nicht das System.   ;)