Получение возраста в годах в запросе SQL - PullRequest
1 голос
/ 25 мая 2010

Здравствуйте, мне было поручено выполнить несколько запросов к большой базе данных SQL Server 2000.

У меня возникла проблема с вопросом: «найдите количество людей в возрасте от 20 до 40 лет»

Как бы я это сделал? Мой предыдущий запрос на подсчет всех выглядит так:

select count(rid) from people where ... 

(при ... не относящихся к делу условиях). Я гуглил некоторые, но единственное, что я нашел для вычисления возраста, настолько велико, что я не вижу, как встроить его в запрос, или это хранимая процедура, для которой у меня нет прав на создание.

Может ли кто-нибудь помочь мне с этим?

Соответствующая часть таблицы сотрудников выглядит так:

RID(unique key) | dateofbirth(datetime) | firstname....

Ответы [ 6 ]

7 голосов
/ 25 мая 2010

Предполагается, что день рождения хранится как 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())
1 голос
/ 25 мая 2010

Вы должны вычислить даты, которые формируют границы вашего диапазона, а затем использовать эти даты.

DECLARE @Today datetime, @StartDate datetime, @EndDate datetime

SET @Today = DateAdd(dd, DateDiff(dd, 0, GetDate()), 0)
SET @StartDate = DateAdd(dd, 1, DateAdd(yy, -40, @Today))
SET @EndDate = DateAdd(yy, -20, @Today)

SELECT *
FROM People
WHERE DateOfBirth BETWEEN @StartDate AND @EndDate

Это дает вам запрос, по которому у вас есть шанс использовать индекс.

1 голос
/ 25 мая 2010
select count(*)
from YourTable
where dateofbirth >= '1970-05-24' and dateofbirth <= '1990-05-24'

Настройте даты в соответствии с текущей датой.

0 голосов
/ 20 июня 2014

Как вы всегда выражаете возраст как целое число ...

select cast(DateDiff(d, people.dob, GetDate()) / 365.25 as int) As Age 
0 голосов
/ 25 мая 2010

Я предполагаю, что в таблице людей есть даты рождения.

Грубый псевдокод.

Select DateDiff(YY, people.DOB. Datetime.NOW) as age
from people
where age....
0 голосов
/ 25 мая 2010

Вы можете сделать что-то вроде: ГОД (GETDATE ()) - ГОД (dateOfBirth)> 20

...