Как рассчитать возраст от даты рождения в sql
Как рассчитать возраст от даты рождения в sql
В моей таблице есть столбец для DOB, но мне нужен возраст, как вычислить его в sql-запросе
SELECT FLOOR(DATEDIFF(DAY, @BirthDate, @TargetDate) / 365.25)
SELECT DATEDIFF(hour,@dob,GETDATE())/8766 AS AgeYearsIntTrunc
Привет ,
попробуйте этот кодовый блок
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
спасибо.... хороший код
Аналогично решению 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)))
Выберите идентификатор,
преобразования(поплавок,преобразования(инт конвертировать(тип 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) как возраст
Не публикуйте ответ на такой старый вопрос!
Вот еще один способ использования 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
Я знаю, что это более старая нить, но она будет по-прежнему преобладать в течение многих последующих лет. Чтобы успокоить всех, я протестировал пару формул, представленных в этой теме, для расчета возраста в годах, и обе они, похоже, синхронизированы. Лично я склоняюсь к первой формуле, поскольку она коротка и элегантна. Если вы хотите успокоить свой ум проверьте это сами:
/*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
Я знаю, что этот вопрос старый, но у меня есть встроенная табличная функция, которая довольно хорошо вычисляет возраст.
Способ его работы заключается в вычислении разницы между @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 )
Это мое решение для 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;
Чтобы рассчитать средний возраст сегодня, вы можете использовать SELECT DATEDIFF(DAY, @Birth, GetDate()) / 365.25
.
Однако расчет может стать более сложным, если вы хотите получить точный возраст в днях или годах.