用month_between做,應(yīng)該會(huì)好一些。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到施秉網(wǎng)站設(shè)計(jì)與施秉網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋施秉地區(qū)。
select
當(dāng)前日期,
出生日期,
trunc(months_between(當(dāng)前日期,出生日期)/12) 年數(shù),
trunc(months_between(當(dāng)前日期,出生日期))%12 月數(shù),
ceil(當(dāng)前日期-add_month(出生日期,trunc(months_between(當(dāng)前日期,出生日期))) 天數(shù) from table
可能一些細(xì)微的地方還需要些調(diào)整,不過(guò)大體上應(yīng)該差不多了。
最后那個(gè)ceil可能要分成兩個(gè)case when的部分是
case when substr(to_char(當(dāng)前日期,'yyyy-mm-dd'),-5) != substr(to_char(出生日期,'yyyy-mm-dd'),-5) then trunc(當(dāng)前日期-add_month(出生日期,trunc(months_between(當(dāng)前日期,出生日期)))
when substr(to_char(當(dāng)前日期,'yyyy-mm-dd'),-5) = substr(to_char(出生日期,'yyyy-mm-dd'),-5) then 1 end 天數(shù)
我看了下你上面的兩個(gè)例子,好像因?yàn)槿掌谙嗟缺容^特殊,所以我嘗試用ceil試試,如果不行那么就用下面這個(gè),我估計(jì)差不多了,不過(guò)我可沒(méi)有環(huán)境,只能是憑空想象,剩下的只能你自己去實(shí)驗(yàn)和修改了。
SQL語(yǔ)句如下:
select?floor(MONTHS_BETWEEN(sysdate,date'2016-1-1')/12)?as?age?from?dual;
結(jié)果:
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 日期相差的月份數(shù)
concat字字符串連接
extract(year from sysdate) 返回當(dāng)前日期的年份
這個(gè)辦法很多,如果是比較精確的可以用month_between函數(shù),然后除以12,最后在trunc這樣就能得到具體的年齡了。
比如trunc(month_between(sysdate,時(shí)間類(lèi)型的生日字段)/12)
個(gè)人感覺(jué)這個(gè)精確一些,能精確到天,只要還沒(méi)過(guò)生日,那么就不會(huì)加一歲。
當(dāng)然二者直接相減trunc((sysdate-時(shí)間類(lèi)型的生日字段)/365)也可以。
sysdate-時(shí)間類(lèi)型的生日字段,這么相減默認(rèn)出現(xiàn)的是相差的天數(shù),所以除以365。這個(gè)也可以,不過(guò)有些年是366天,不過(guò)因?yàn)?66天的年分比較少,所以基本上不會(huì)相差很多。只是會(huì)出現(xiàn),“提前”的情況。不過(guò)80年最多才21天(大概是這樣,我沒(méi)細(xì)算,就算四年一次),所以對(duì)實(shí)際影響不是特別大。如果要求準(zhǔn)確那么還是上面的靠譜一些。
用函數(shù)取出字段年,然后用現(xiàn)在的年相減也可以。這個(gè)就是一個(gè)大概(個(gè)人認(rèn)為更加不靠譜),比如一個(gè)人2050年12月30日出生,現(xiàn)在是2055年后的1月1號(hào),那么按照年來(lái)說(shuō)就是5,但是其實(shí)才4歲多一點(diǎn),所以年這個(gè)只是一個(gè)大概的,不會(huì)十分準(zhǔn)確。
可用to_char函數(shù)將date類(lèi)型轉(zhuǎn)成字符類(lèi)型。
如emp表中有如下數(shù)據(jù):
如果計(jì)算生日的方法是當(dāng)前日期的年份減去生日的年份,可用如下語(yǔ)句:
select?ename,hiredate,to_char(sysdate,'yyyy')-to_char(hiredate,'yyyy')?from?emp;
查詢結(jié)果:
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?歲
本文題目:oracle怎么算不出年齡,oracle日期算年齡
本文來(lái)源:http://chinadenli.net/article3/dsijcis.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、全網(wǎng)營(yíng)銷(xiāo)推廣、Google、手機(jī)網(wǎng)站建設(shè)、云服務(wù)器、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)