数据库表中只有“出生日期”没有“年龄”。我想统计一个表中数据的平均年龄怎么统计?

如题所述

取当前日期的年份,再取出生日期的年份,两者相减就是年龄。不知道你用的什么数据库啊?
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-25
不知道你什么数据库啊

如果是 Oracle
SELECT
AVG ( (sysdate - 出生日期) / 365 )
FROM


如果是 SQL Server
SELECT
AVG ( DATEDIFF(yy, 出生日期, GETDATE()) )
FROM
追问

是oracle。这个数字准确吗?

追答

sysdate = 今天的 时间
sysdate - 出生日期 = 出生到今天的 天数
(sysdate - 出生日期) / 365 = 计算出来的岁数 (没有取整, 没有考虑闰年)

要取整的话, 加一个 trunc 函数
AVG ( TRUNC( (sysdate - 出生日期) / 365 ) )

下面是一个例子, 计算 1981年1月2日出生的人的年龄。

SQL> select trunc( (sysdate - TO_DATE('19810102', 'YYYYMMDD') ) / 365 ) TEST from dual;
TEST
----------
31

本回答被提问者采纳
第2个回答  2012-12-24
给你提供一个计算日期的算法,我写了一个函数。调用函数就可以了。select AVG(Fun_Getage(出生日期,to_char(sysdate,'yyyymmdd'),'0')) FROM 表 where 查询条件....
下面是函数的具体代码
CREATE OR REPLACE FUNCTION Fun_Getage(p_Birthday IN VARCHAR2, --格式 yyyymmdd
p_Presentday IN VARCHAR2, --格式 yyyymmdd
p_Caltype IN VARCHAR2) RETURN NUMBER IS

-- p_Birthday 出生日期
-- p_Presentday 截止日:为空时默认为系统时间
-- p_Caltype 计算方式:'0'--截止到日; '1'--截止到月; '2'--年初; 3'--虚岁

Lv_Enddate VARCHAR2(8); -- 截止日
Lv_Caltype VARCHAR2(3); -- 计算方式数字型
Ln_Birthyear NUMBER(4); -- 生日年
Ln_Birthmonth NUMBER(2); -- 生日月
Ln_Birthday NUMBER(2); -- 生日日
Ln_Endyear NUMBER(4); -- 截止年
Ln_Endmonth NUMBER(2); -- 截止月
Ln_Endday NUMBER(2); -- 截止日

Ln_Age NUMBER(6); -- 年龄
BEGIN
-- 出生日期空参数处理
-- 出生日期yyyymmdd
IF p_Birthday IS NULL THEN
--生日为空返回-1
RETURN - 1;
END IF;

-- 计算类型为空,则默认截止到日
Lv_Caltype := NULL;
IF p_Caltype IS NULL THEN
Lv_Caltype := '0';
ELSE
Lv_Caltype := p_Caltype;
END IF;

-- 截止日期yyyymmdd
IF p_Presentday IS NULL THEN
Lv_Enddate := To_Char(SYSDATE, 'yyyymmdd');
ELSIF Length(p_Presentday) = '4' THEN
Lv_Enddate := p_Presentday || '0101';
ELSIF Length(p_Presentday) = '6' THEN
Lv_Enddate := p_Presentday || '01';
ELSIF Length(p_Presentday) = '8' THEN
Lv_Enddate := p_Presentday;
ELSE
Lv_Enddate := To_Char(SYSDATE, 'yyyymmdd');
END IF;

Ln_Birthyear := To_Number(Substr(p_Birthday, 1, 4)); -- 生日年
Ln_Birthmonth := To_Number(Substr(p_Birthday, 5, 2)); -- 生日月
Ln_Birthday := To_Number(Substr(p_Birthday, 7, 2)); -- 生日日
Ln_Endyear := To_Number(Substr(Lv_Enddate, 1, 4)); -- 截止年
Ln_Endmonth := To_Number(Substr(Lv_Enddate, 5, 2)); -- 截止月
Ln_Endday := To_Number(Substr(Lv_Enddate, 7, 2)); -- 截止日

-- 计算到截止日期
IF Lv_Caltype = '0' THEN
IF Ln_Endday < Ln_Birthday THEN
Ln_Endmonth := Ln_Endmonth - 1;
END IF;

IF Ln_Endmonth < Ln_Birthmonth THEN
Ln_Endyear := Ln_Endyear - 1;
END IF;

END IF;

-- 计算到截止月份
IF Lv_Caltype = '1' THEN
IF Ln_Endmonth < Ln_Birthmonth THEN
Ln_Endyear := Ln_Endyear - 1;
END IF;

END IF;

-- 计算到截止年度
-- 计算年龄
Ln_Age := Ln_Endyear - Ln_Birthyear;
IF Lv_Caltype = '3' THEN
Ln_Age := Ln_Age + 1;
END IF;

RETURN Ln_Age;
END Fun_Getage;
相似回答