永发信息网

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

答案:3  悬赏:80  手机版
解决时间 2021-04-05 15:52
数据库表中只有“出生日期”没有“年龄”。我想统计一个表中数据的平均年龄怎么统计?
最佳答案
不知道你什么数据库啊

如果是 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
全部回答
取当前日期的年份,再取出生日期的年份,两者相减就是年龄。不知道你用的什么数据库啊?
给你提供一个计算日期的算法,我写了一个函数。调用函数就可以了。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;
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
1851年第一届世界博览会是英国展出最新工业成
怎样在银行投资黄金,个人怎样投资黄金
东风天锦副水箱经长缺水
罗斯蒂精密制造苏州有限公司注塑车间有没有危
从日本带回来的台式电脑,在国内买了一个变压
502胶水较好塑料后能装热水吗?
《温州两家人》里的"侯三寿"所使用的手机多少
戳是什么意思
东北平原北部纬度较高(约53°N),农作物同
如何判断一个相机是全画幅的还是APS画幅相机
昆虫是用什么呼吸的用塑料做水杯主要是利用了
有哲理的现代诗歌,富有哲理的现代诗
汇泊停车场(出入口)(宾水西道80号附近汇泊停
psp不能充电 指示灯不亮 拔了电池 直接插在电
单选题________atthebuildingsite,thew
推荐资讯
整牙齿矫正25岁可以吗
绍兴和议规定南宋皇帝A.向契丹称臣B.名义上管
判断题双胞胎的性状一定是完全相同的.
370·7克等于多少公斤
请告知真如香堂的东西和养今生沉香相比较谁更
哈尔滨evisu衣服打折吗
这位cos名字是什么,要准确的,谢谢
夏天有宝宝怎么驱蚊,夏天为宝宝驱蚊都有哪些
简易净水器能否将硬水变为软水
在如图所示的“探究影响电流做功的因素”的实
de feels手表的日历错半天 怎么调整
dota6.70之后的版本载入界面左下角的那个英雄
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?