Vypadá to jako triviální problém, nicméně triviální řešení zde nejsou správná.
Nejprve tedy správné řešení:
/* Vrátí věk ke vztažnému datu určený dle data narození. */ ALTER FUNCTION dbo.Age ( @DatumNarozeni smalldatetime, @VztazneDatum smalldatetime ) RETURNS tinyint AS BEGIN RETURN DATEDIFF(year, @DatumNarozeni, @VztazneDatum) - (CASE WHEN (100 * MONTH(@VztazneDatum) + DAY(@VztazneDatum)) < (100 * MONTH(@DatumNarozeni) + DAY(@DatumNarozeni)) THEN 1 ELSE 0 END) END
A pár ukázek špatných řešení:
DATEDIFF(year, @birthdate, @enddate) SELECT DATEDIFF (year, @birthdate, @endDate) - CASE WHEN DATEPART(dy, @birthdate) <= DATEPART(dy, @endDate) THEN 1 ELSE 0 END
První pokus od sebe jen odečte letošní letopočet od letopočtu narození.
Druhý pokus zase nefunguje korektně s přestupnými roky, protože pak není počet dnů od 1.1. stejný.