数据库表中只有“出生日期”没有“年龄”。我想统计一个表中数据的平均年龄怎么统计?
答案:3 悬赏:80 手机版
解决时间 2021-04-05 15:52
- 提问者网友:动次大次蹦擦擦
- 2021-04-05 12:47
数据库表中只有“出生日期”没有“年龄”。我想统计一个表中数据的平均年龄怎么统计?
最佳答案
- 五星知识达人网友:怙棘
- 2021-04-05 12:56
不知道你什么数据库啊
如果是 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
如果是 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
全部回答
- 1楼网友:笑迎怀羞
- 2021-04-05 14:29
取当前日期的年份,再取出生日期的年份,两者相减就是年龄。不知道你用的什么数据库啊?
- 2楼网友:duile
- 2021-04-05 14:19
给你提供一个计算日期的算法,我写了一个函数。调用函数就可以了。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;
下面是函数的具体代码
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;
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯