
Oracle如何根据出生日期判断公民是否成年呢?
出生日期的数据类型是varchar2的,具体数据是这样的
20221010
20221011
20221012
20221013
年月日的格式
有个需要特别注意的地方,就是需求是统计一段时间内的,比如今年国庆期间未成年的
例子:小明是2004年10月02日出生,小明10月1日还没有成年,可是10月2日已经成年了,请问这种需求怎么实现呢?
有没有办法查出小明距离成年还有多少天呢?

create table info (name varchar2(50) ,birth varchar2(8));
insert into info values('小赵','20000101');
insert into info values('小钱','20220101');
insert into info values('小孙','20041010');
insert into info values('小李','20041001');
select name,birth, ceil((to_date(birth,'yyyy-mm-dd') + interval '18' year)-sysdate) Days from info where (to_date(birth,'yyyy-mm-dd') + interval '18' year) > sysdate;--------未成年人员,生日,及天数



SQL> select * from tb_zxp;
NAME BIRTHDATE
------------------------------ ------------------------
TOM 20040929
JACK 20041014
MIKE 20041010
STEVE 20070721
with t as (select name,months_between (trunc(sysdate),to_date(birthdate,'yyyymmdd')) as m_b,to_date(birthdate,'yyyymmdd') as birthdate,trunc(sysdate) from tb_zxp)
2 select name,birthdate,case when m_b>=216 then 1 else 0 end if_adult,case when m_b<216 then add_months(birthdate,216) -trunc(sysdate) end as need_days from t;
NAME BIRTHDATE IF_ADULT NEED_DAYS
------------------------------ ------------------- ---------- ----------
TOM 2004-09-29 00:00:00 1
JACK 2004-10-14 00:00:00 0 4
MIKE 2004-10-10 00:00:00 1
STEVE 2007-07-21 00:00:00 0 1015


with t as (select name,months_between (trunc(sysdate),to_date(birthdate,'yyyymmdd')) as m_b,to_date(birthdate,'yyyymmdd') as birthdate,trunc(sysdate) from tb_zxp)
select name,birthdate,case when m_b>=216 then 1 else 0 end if_adult,case when m_b<216 then add_months(birthdate,216) -trunc(sysdate) end as need_days from t;


add_months函数有个问题,在处理闰年的2月29日时,匹配的非闰年的2月份,日期是28号,这个时候应该不算成年


