重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
用month_between做,应该会好一些。
站在用户的角度思考问题,与客户深入沟通,找到施秉网站设计与施秉网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广、主机域名、网页空间、企业邮箱。业务覆盖施秉地区。
select
当前日期,
出生日期,
trunc(months_between(当前日期,出生日期)/12) 年数,
trunc(months_between(当前日期,出生日期))%12 月数,
ceil(当前日期-add_month(出生日期,trunc(months_between(当前日期,出生日期))) 天数 from table
可能一些细微的地方还需要些调整,不过大体上应该差不多了。
最后那个ceil可能要分成两个case when的部分是
case when substr(to_char(当前日期,'yyyy-mm-dd'),-5) != substr(to_char(出生日期,'yyyy-mm-dd'),-5) then trunc(当前日期-add_month(出生日期,trunc(months_between(当前日期,出生日期)))
when substr(to_char(当前日期,'yyyy-mm-dd'),-5) = substr(to_char(出生日期,'yyyy-mm-dd'),-5) then 1 end 天数
我看了下你上面的两个例子,好像因为日期相等比较特殊,所以我尝试用ceil试试,如果不行那么就用下面这个,我估计差不多了,不过我可没有环境,只能是凭空想象,剩下的只能你自己去实验和修改了。
SQL语句如下:
select floor(MONTHS_BETWEEN(sysdate,date'2016-1-1')/12) as age from dual;
结果:
select floor(months_between(to_date(concat(extract(year from sysdate),'-10-31'),'YYYY-MM-DD'),to_date(生日的日期,'yyyy-mm-dd'))/12) from table_name
floor 向下取整
months_between 日期相差的月份数
concat字字符串连接
extract(year from sysdate) 返回当前日期的年份
这个办法很多,如果是比较精确的可以用month_between函数,然后除以12,最后在trunc这样就能得到具体的年龄了。
比如trunc(month_between(sysdate,时间类型的生日字段)/12)
个人感觉这个精确一些,能精确到天,只要还没过生日,那么就不会加一岁。
当然二者直接相减trunc((sysdate-时间类型的生日字段)/365)也可以。
sysdate-时间类型的生日字段,这么相减默认出现的是相差的天数,所以除以365。这个也可以,不过有些年是366天,不过因为366天的年分比较少,所以基本上不会相差很多。只是会出现,“提前”的情况。不过80年最多才21天(大概是这样,我没细算,就算四年一次),所以对实际影响不是特别大。如果要求准确那么还是上面的靠谱一些。
用函数取出字段年,然后用现在的年相减也可以。这个就是一个大概(个人认为更加不靠谱),比如一个人2050年12月30日出生,现在是2055年后的1月1号,那么按照年来说就是5,但是其实才4岁多一点,所以年这个只是一个大概的,不会十分准确。
可用to_char函数将date类型转成字符类型。
如emp表中有如下数据:
如果计算生日的方法是当前日期的年份减去生日的年份,可用如下语句:
select ename,hiredate,to_char(sysdate,'yyyy')-to_char(hiredate,'yyyy') from emp;
查询结果:
CREATE TABLE test (
id varchar2(10),
date_of_birth date
);
INSERT INTO test VALUES('05576767', TO_DATE('1957-3-28', 'YYYY-MM-DD'));
INSERT INTO test VALUES('05563743', TO_DATE('2013-3-27', 'YYYY-MM-DD'));
INSERT INTO test VALUES('05563744', TO_DATE('2013-7-15', 'YYYY-MM-DD'));
INSERT INTO test VALUES('05563745', TO_DATE('2013-6-7', 'YYYY-MM-DD'));
INSERT INTO test VALUES('05563741', TO_DATE('2010-11-21', 'YYYY-MM-DD'));
SELECT
id,
CASE WHEN MONTHS_BETWEEN(TRUNC(SYSDATE), date_of_birth) * 1.0 / 12 1 THEN ROUND(MONTHS_BETWEEN(TRUNC(SYSDATE), date_of_birth) * 1.0 / 12, 1)
WHEN MONTHS_BETWEEN(TRUNC(SYSDATE), date_of_birth) 1 THEN ROUND(MONTHS_BETWEEN(TRUNC(SYSDATE), date_of_birth), 1)
ELSE TRUNC(sysdate) - date_of_birth
END AS age,
CASE WHEN MONTHS_BETWEEN(TRUNC(SYSDATE), date_of_birth) * 1.0 / 12 1 THEN '岁'
WHEN MONTHS_BETWEEN(TRUNC(SYSDATE), date_of_birth) 1 THEN '月'
ELSE '天'
END AS Unit
FROM
test;
ID AGE UNIT
-------------------- ---------- ------
05576767 56.3 岁
05563743 3.6 月
05563744 1 天
05563745 1.3 月
05563741 2.7 岁