Pratika05 Ответов: 9

Как рассчитать возраст от даты рождения в sql


Как рассчитать возраст от даты рождения в sql
В моей таблице есть столбец для DOB, но мне нужен возраст, как вычислить его в sql-запросе

9 Ответов

Рейтинг:
68

damodara naidu betha

Привет ,

попробуйте этот кодовый блок

  DECLARE @date datetime, @tmpdate datetime, @years int, @months int, @days int
SELECT @date = '2/29/04'

SELECT @tmpdate = @date

SELECT @years = DATEDIFF(yy, @tmpdate, GETDATE()) - CASE WHEN (MONTH(@date) > MONTH(GETDATE())) OR (MONTH(@date) = MONTH(GETDATE()) AND DAY(@date) > DAY(GETDATE())) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)
SELECT @months = DATEDIFF(m, @tmpdate, GETDATE()) - CASE WHEN DAY(@date) > DAY(GETDATE()) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(m, @months, @tmpdate)
SELECT @days = DATEDIFF(d, @tmpdate, GETDATE())

SELECT @years, @months, @days


Pratika05

спасибо.... хороший код

Рейтинг:
2

Jim Gallott

Аналогично решению 5, но позволяет избежать преобразования текста в числовое и обратно.

Предполагается, что дата рождения (dob) и дата "по состоянию на" (as_of_date) находятся в формате даты.

floor((datepart (yy,as_of_date)+(datepart(mm,as_of_date)*.01)+(datepart(dd,as_of_date)*.0001))-(datepart (yy,dob)+(datepart(mm,dob)*.01)+(datepart(dd,dob)*.0001)))

Для dob = 7/12/1960 и as_of_date = 3/12/2020:

2020.0312 - 1960.0712 = 59.9600

Десятичная часть-это тарабарщина, но вы ищете только часть floor (), которая равна 59.


Рейтинг:
1

1Lam

Выберите идентификатор,
преобразования(поплавок,преобразования(инт конвертировать(тип varchar(10),функции getdate(),112))) как Todayday,
преобразования(поплавок,преобразования(инт конвертировать(тип varchar(10),преобразования(дата,функция ltrim(функция rtrim(доб)))),112))) как доб,
(преобразование(поплавок,преобразования(инт конвертировать(тип varchar(10),getdate(),то 112))) -
преобразования(поплавок,преобразования(инт конвертировать(тип varchar(10),преобразования(дата,функция ltrim(функция rtrim(доб)))),112))))/10000 как AgeFloat,
Конвертировать(тип int(преобразование(поплавок,преобразования(инт конвертировать(тип varchar(10),getdate(),то 112))) -
преобразования(поплавок,преобразования(инт конвертировать(тип varchar(10),преобразования(дата,функция ltrim(функция rtrim(доб)))),112))))/10000) как возраст
От DOBTable

Записи:
Отформатируйте сегодняшнюю дату и дату рождения как YYYYMMDD и вычтите today-DOB.
Преобразуйте это число в плавающее и разделите на 10000.
Целым числом этого результата является возраст.
Преобразование из Float в integer не округляет число.
Возраст всегда точен.
Я добавил шаги, чтобы показать эти преобразования, но вам нужна только возрастная линия.
Конвертировать(тип int(преобразование(поплавок,преобразования(инт конвертировать(тип varchar(10),getdate(),то 112))) -
преобразования(поплавок,преобразования(инт конвертировать(тип varchar(10),преобразования(дата,функция ltrim(функция rtrim(доб)))),112))))/10000) как возраст


Maciej Los

Не публикуйте ответ на такой старый вопрос!

Рейтинг:
1

Member 14817498

Вот еще один способ использования SQL, который даст вам их конкретный возраст на основе текущей даты и даты их рождения.

Ниже написано для Oracle.

выберите доб,
случай, когда to_char(литой(компания "Новые системы" как дата),'мм') || to_char(литой(компания "Новые системы" как дата),'ДД') &ГТ;=
to_char(доб,'мм') || to_char(Добролюбов, "ДД")
затем to_char(литой(компания "Новые системы" как дата),'гггг') - to_char(Добролюбов, "гггг")
еще to_char(литой(компания "Новые системы" как дата),'гггг') - to_char(доб'гггг') - 1
конец века
из таблицы my_table

Вот версия того же sql, которая работает для Netezza.

выберите доб,
случай, когда lpad(extract (months from current_date),2,'0') ||
lpad(extract (days from current_date),2,'0') >=
lpad(выписка (месяцы из dob),2,'0') ||
lpad(extract (days from dob),2,'0')
затем экстракт (лет с current_date используется) - выдержка (лет с доб)
else extract (years from current_date) - извлечение (years from dob) - 1
конец века
из таблицы my_table


Для SQL Server :

выберите доб,
случай, когда right ('00' + cast(month(getdate()) as varchar(2)),2) + right('00' + cast(day(getdate()) as varchar(2)),2) >=
права('00' + литые(месяц(дата рождения) как varchar(2)),2) + прав('00' + литые(день(дата рождения) как varchar(2)),2)
затем год(getdate()) - год(dob)
else year(getdate()) - год(dob) - 1
конец века
из таблицы my_table


Рейтинг:
1

Member 14828730

Я знаю, что это более старая нить, но она будет по-прежнему преобладать в течение многих последующих лет. Чтобы успокоить всех, я протестировал пару формул, представленных в этой теме, для расчета возраста в годах, и обе они, похоже, синхронизированы. Лично я склоняюсь к первой формуле, поскольку она коротка и элегантна. Если вы хотите успокоить свой ум проверьте это сами:

/*Create table to hold every single DOB since 1/1/1900*/
Create table dbo.Temp(DOB Date)
go

/*populate table with age*/

;with temp as(
  select convert(date, '01/01/1900') As DOB
  Union all
  Select DateAdd(Day, 1, DOB)
  from temp
  Where DateAdd(Day, 1, DOB) <= Convert(Date, GetDate())
  )
Insert into dbo.Temp(DOB)
select DOB
from temp
option(maxrecursion 0)

/*test two formulas for calculating age*/

;with test as(
Select DOB, Age1 = FLOOR(DATEDIFF(DAY, DOB , getdate()) / 365.25),
  Age2 =
	case when right('00' + cast(month(getdate()) as varchar(2)),2) + right('00' + cast(day(getdate()) as varchar(2)),2) >= 
	right('00' + cast(month(dob) as varchar(2)),2) + right('00' + cast(day(DOB) as varchar(2)),2) 
	then year(getdate()) - year(DOB)
	else year(getdate()) - year(DOB) - 1 
	end
From dbo.Temp
)
select *
from test
where age1 <> age2


Рейтинг:
1

Kelly Herald

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

Способ его работы заключается в вычислении разницы между @StartTime и @EndTime в месяцах. Затем он проверяет день рождения @StartTime чтобы увидеть, больше ли он, чем день рождения. @EndTime, если это так, то вычтите 1 из расчета месяца, потому что день рождения человека еще не наступил. В противном случае вычтите 0.

Если записать это как встроенную табличную функцию, а не скалярную функцию, то запрос, в котором она используется, будет выполняться очень быстро.

Вы можете вызвать его для одного вычисления по:

SELECT AgeInYears FROM dbo.CalculateAgeInYears('1980-07-01', GETDATE())


Или вы можете использовать перекрестное применение для расчета из таблицы:
SELECT *
FROM #SampleData AS t
CROSS APPLY dbo.CalculateAgeInYears(t.DOB, GETDATE()) AS fn


CREATE FUNCTION [dbo].[CalculateAgeInYears]
(	 	 
  @StartDate DATETIME,
  @EndDATE DATETIME
)	 	 
RETURNS TABLE	 	 
AS	 	 
RETURN	 	 
(
  SELECT (DATEDIFF(MONTH, @StartDate, @EndDate) - CASE WHEN DATEPART(DAY, @StartDate) > DATEPART(DAY, @EndDate) THEN 1 ELSE 0 END) / 12 AS AgeInYears
)


Рейтинг:
0

ExpertSkinDoc

Это мое решение для RAP, Report Object Pascal, как и в ReportBuilder для Medisoft Report Professional

procedure AgeOnCalc(var Value: Variant);

var currentyear, currentmonth, currentday : integer;
    patientyear, patientmonth, patientday : integer;

begin

  decodedate(CurrentDate, currentyear, currentmonth, currentday);
  decodedate(Patient['Date of Birth'], patientyear, patientmonth, patientday);
  if (patientmonth > currentmonth) or ((patientmonth = currentmonth) and (patientday > currentday)) then
    value := currentyear - patientyear - 1
  else
    value := currentyear - patientyear;

end;


Рейтинг:
0

Abhinav S

Чтобы рассчитать средний возраст сегодня, вы можете использовать SELECT DATEDIFF(DAY, @Birth, GetDate()) / 365.25.

Однако расчет может стать более сложным, если вы хотите получить точный возраст в днях или годах.