扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
根据出生日期查询年龄用的还挺多的。
创新互联建站主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、全网营销推广、网站程序开发、HTML5响应式网站建设、成都做手机网站、微商城、网站托管及成都网站维护公司、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为成都封阳台行业客户提供了网站设计服务。
简单分析一下,加入一个孩子五岁半了,那习惯认为他还是5岁。
用Oracle提供的months_between()函数,先获取出生日期和当前日期的月数,然后除以12向下取整:
使用的时候,将时间段替换成出生日期对应的字段即可。
如果,计算年龄用的次数非常多,最好写成自定义函数。
肯定的,你的子查询写,要么是写多了,要么是写少了。
写多了,可以不用写子查询的
(select
(to_char(sysdate,'YYYY')-to_char(c.birthdate,
'YYYY'))
age
from
C
c)年龄,
改为
to_char(sysdate,'YYYY')-to_char(c.birthdate,
'YYYY')
年龄即可
写少了.(先确定id在c表中没有重复啊。)
from中去掉c
,然后在
(select
(to_char(sysdate,'YYYY')-to_char(c.birthdate,
'YYYY'))
age
from
C
c)年龄,
改为
(select
(to_char(sysdate,'YYYY')-to_char(c.birthdate,
'YYYY'))
age
from
C
c
where
c.id=a.id)年龄,
用case when
如:
select name,case when age3 then tranc(between_month(sysdate,生日)/12)
when age 1 and age3 then tranc(between_month(sysdate,生日)/12) then
when age 1 then between_month(sysdate,生日)/12
end case aaa
from 姓名表
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) 返回当前日期的年份
SQL语句如下:
select floor(MONTHS_BETWEEN(sysdate,date'2016-1-1')/12) as age from dual;
结果:
这个办法很多,如果是比较精确的可以用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岁多一点,所以年这个只是一个大概的,不会十分准确。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流