DELIMITER //
CREATE FUNCTION baggabu_alter(birthday_date varchar(11))
RETURNS int
BEGIN
DECLARE heute varchar(11);
DECLARE dieses_jahr int;
DECLARE dieser_monat int;
DECLARE heutiger_tag int;
DECLARE geburtstag_jahr int;
DECLARE geburtstag_monat int;
DECLARE geburtstag_tag int;
DECLARE jahresdifferenz int;
DECLARE aktuelles_alter int;

SET heute = current_date();
SET dieses_jahr = YEAR(heute);
SET dieser_monat = MONTH(heute);
SET heutiger_tag = DAY(heute);

SET geburtstag_jahr = YEAR(birthday_date);
SET geburtstag_monat = MONTH(birthday_date);
SET geburtstag_tag = DAY(birthday_date);

/*
 * Grundsätzlich ist das Alter die Differenz aus dem Aktuellen Jahr und dem Geburtsjahr 
 */ 
SET jahresdifferenz = dieses_jahr - geburtstag_jahr;

/*
 * Es sei denn der Geburtstag im aktuellen Jahr wurde noch nicht gefeiert (Fall 1 - Geburtsmonat ist noch nicht)
 * zum Beispiel heute ist Februar, aber der Geburtstag ist im November
 */
 IF(dieser_monat < geburtstag_monat) THEN
	SET aktuelles_alter = jahresdifferenz - 1;
 END IF;
 
 /*
  * Fall 2: Der Geburtstag ist im Aktuellen Monat - dann ist der Tag entscheidend!
  */
 IF(dieser_monat = geburtstag_monat) THEN
 
	/* Fall 2a) Der Geburtstag im Monat war noch nicht, dann gilt das selbe wie in Fall 1 */
	IF(heutiger_tag < geburtstag_tag) THEN
		SET aktuelles_alter = jahresdifferenz - 1;
	
    /* Fall 2b) Der Geburtstag im Monat war schon oder ist heute, dann zählen die Jahre */
	ELSE
		SET aktuelles_alter = jahresdifferenz;
	END IF;
END IF;


/* Fall 3: Der Geburtsmonat liegt in der Vergangenheit, dann gilt wieder das die Jahresdifferenz entscheidet. */
IF(dieser_monat > geburtstag_monat) THEN
	SET aktuelles_alter = jahresdifferenz;
END IF;

RETURN aktuelles_alter;

END //
DELIMITER ;
