Определение возраста по дате рождения и тек.дате

darkbird81
Дата: 23.01.2009 16:42:20
Нужно определить возраст сотрудника, в годах естественно, просто в годах.
Сделать желательно в SQL-запросе.
Запутался в разнообразных топиках тут на форуме.
Кто-то считает через дни, учитывая високосные года, кто-то через месяцы, кто-то целые программы пишет..

1. вот беру просто вычитаю дату рождения из тек.даты (тек.дата 23.01.2009):
select ...
({fn CURRENT_DATE()}-K1.Kpu_DtRoj) AS Age1

получаю разность типа дата, но почему-то неверно (на мой взгляд) считается число месяцев и дней между датами.

2. использую ODBC-функцию и считаю возраст через количество месяцев:
select...
{fn TIMESTAMPDIFF(SQL_TSI_MONTH, K1.Kpu_DtRoj, {fn CURRENT_DATE()})}/12 AS Age2

получаю вроде правильный возраст.

Что можете сказать ? Верны ли мои рассуждения и можно ли так считать возраст ?

результат работы запроса в небольшом прилагаемом файле.
_djХомяг
Дата: 23.01.2009 16:56:47
datediff
Mr Marmelad
Дата: 23.01.2009 17:04:16
Коллега попробуйте такую функцию:

CREATE FUNCTION dbo.fAgeCalc(@DOB datetime,@Date datetime) 
RETURNS smallint
AS
-- * select dbo.fAgeCalc('1989-05-11',GetDate())

BEGIN 
RETURN (SELECT 
	CASE 
		WHEN MONTH(@DOB)>MONTH(@Date) THEN DATEDIFF(YYYY,@DOB,@Date)-1 
		WHEN MONTH(@DOB)<MONTH(@Date) THEN DATEDIFF(YYYY,@DOB,@Date) 
		WHEN MONTH(@DOB)=MONTH(@Date) THEN 
             CASE 
		WHEN DAY(@DOB)>DAY(@Date) THEN DATEDIFF(YYYY,@DOB,@Date)-1 
		ELSE DATEDIFF(YYYY,@DOB,@Date) 
	 END

    END) 
END
darkbird81
Дата: 23.01.2009 17:11:55
_djХомяг
datediff


при расчете среднего возраста по подразделениям datediff выдает результат на год меньше :(
Забыла_пароль...
Дата: 23.01.2009 17:19:19
Так покатит?

CREATE FUNCTION [dbo].[Age_calc](@birthday int,@date int)
RETURNS int
AS

declare @value int
set @value = max((((-@birthday/10000+@date/10000))*10000
+ (-@birthday%10000/100+@date%10000/100)*100
+ (-@birthday%100+@date%100)
)/10000)

return @value
darkbird81
Дата: 26.01.2009 15:11:54
Mr Marmelad

о да, пасиб !! похоже правильно работает. а то что я раньше делал было с ошибкой.

Забыла_пароль...

не смог разобраться в запросе.. программно делаю- дробные числа выдает, а запросом- не получается, т.к. выдает ошибку преобразования типов (я обращаюсь к sql-серверу через ODBC-драйвер)
iap
Дата: 26.01.2009 15:49:43
SELECT
 DATEDIFF(YEAR,@Birthday, GETDATE())+
 (SIGN(DATEDIFF(DAY,@Birthday, DATEADD(YEAR, YEAR(@Birthday)-YEAR(GETDATE()), GETDATE())))-1)/2;
Yuraz.com
Дата: 10.12.2016 20:15:54
так делаю:
SELECT YEAR(getdate()-'20101209')-1900
Дедушка
Дата: 10.12.2016 23:08:30
Yuraz.com,
две тысячи девятый год, две тысячи девятый, Карл!