Предполагается, что день рождения хранится как DateTime
Select Count(*)
From (
Select Id, Floor(DateDiff(d, BirthDate, GetDate()) / 365.25) As Age
From People
) As EmpAges
Where EmpAges Between 20 And 40
Это также может быть записано без производной таблицы, например:
Select Count(*)
From People
Where Floor(DateDiff(d, BirthDate, GetDate()) / 365.25) Between 20 And 40
Еще один способ - использовать DateAdd. Как упоминали OMG Ponies и ck, этот будет наиболее эффективным из всех, так как он позволит использовать индекс dateOfBirth, если он существует.
Select Count(*)
From People
Where DateOfBirth Between DateAdd(yy, -40, GetDate()) And DateAdd(yy, -20, GetDate())