2010-05-24 3 views
1

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

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

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

select count(rid) from people where ... 

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

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

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

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

Как вы хранение дня рождения? Datetime? –

+0

@Jon @ Ola исправил это, чтобы включить мою самую основную схему. – Earlz

ответ

7

Предполагая, что день рождения хранится в виде 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()) 
+0

@OMG Ponies. В первом примере используется производная таблица (EmpAges). – Thomas

+0

+1: Последний является лучшим, поскольку он использует индекс в столбце 'dateofbirth', если предположить, что он существует. И будет только один проход за столом ... –

+1

Нижняя часть - единственный хороший ответ, вы должны удалить верхнюю часть, так как она будет в тысячу раз медленнее. – cjk

1
select count(*) 
from YourTable 
where dateofbirth >= '1970-05-24' and dateofbirth <= '1990-05-24' 

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

+0

Ничего себе на самом деле, что любопытное заставляет меня смеяться. Это такой хак, но это сработало – Earlz

+1

Проблема в том, что если это то, что нужно запускать на регулярной основе, вы постоянно будете обновлять свою строку. – taylonr

+0

Несомненно, это не самая стойкая вещь (и я не буду использовать ее вслепую по поводу других идей здесь: P), но она выполняет свою работу без необходимости полагаться на встроенные функции и тому подобное. Кроме того, если вы создаете запрос с языка программирования, вы, безусловно, можете получить текущую дату из этой среды. Просто, хотя это было бы неплохое предложение, чтобы показать, что все не нужно постоянно разрабатывать :) – Jakob

0

Вы могли бы сделать что-то вроде: ГОДА (GETDATE()) - YEAR (DateOfBirth)> 20

0

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

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

Select DateDiff(YY, people.DOB. Datetime.NOW) as age 
from people 
where age.... 
1

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

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 

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

+0

Это лучший ответ. – cjk

0

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

select cast(DateDiff(d, people.dob, GetDate())/365.25 as int) As Age 
Смежные вопросы