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ý.