根據(jù)出生日期查詢年齡用的還挺多的。
創(chuàng)新互聯(lián)建站主要為客戶提供服務(wù)項目涵蓋了網(wǎng)頁視覺設(shè)計、VI標(biāo)志設(shè)計、全網(wǎng)營銷推廣、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式網(wǎng)站建設(shè)、成都做手機網(wǎng)站、微商城、網(wǎng)站托管及成都網(wǎng)站維護公司、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務(wù)器租用、視頻、平面設(shè)計、SEO優(yōu)化排名。設(shè)計、前端、后端三個建站步驟的完善服務(wù)體系。一人跟蹤測試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為成都封陽臺行業(yè)客戶提供了網(wǎng)站設(shè)計服務(wù)。
簡單分析一下,加入一個孩子五歲半了,那習(xí)慣認為他還是5歲。
用Oracle提供的months_between()函數(shù),先獲取出生日期和當(dāng)前日期的月數(shù),然后除以12向下取整:
使用的時候,將時間段替換成出生日期對應(yīng)的字段即可。
如果,計算年齡用的次數(shù)非常多,最好寫成自定義函數(shù)。
肯定的,你的子查詢寫,要么是寫多了,要么是寫少了。
寫多了,可以不用寫子查詢的
(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表中沒有重復(fù)啊。)
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 日期相差的月份數(shù)
concat字字符串連接
extract(year from sysdate) 返回當(dāng)前日期的年份
SQL語句如下:
select?floor(MONTHS_BETWEEN(sysdate,date'2016-1-1')/12)?as?age?from?dual;
結(jié)果:
這個辦法很多,如果是比較精確的可以用month_between函數(shù),然后除以12,最后在trunc這樣就能得到具體的年齡了。
比如trunc(month_between(sysdate,時間類型的生日字段)/12)
個人感覺這個精確一些,能精確到天,只要還沒過生日,那么就不會加一歲。
當(dāng)然二者直接相減trunc((sysdate-時間類型的生日字段)/365)也可以。
sysdate-時間類型的生日字段,這么相減默認出現(xiàn)的是相差的天數(shù),所以除以365。這個也可以,不過有些年是366天,不過因為366天的年分比較少,所以基本上不會相差很多。只是會出現(xiàn),“提前”的情況。不過80年最多才21天(大概是這樣,我沒細算,就算四年一次),所以對實際影響不是特別大。如果要求準(zhǔn)確那么還是上面的靠譜一些。
用函數(shù)取出字段年,然后用現(xiàn)在的年相減也可以。這個就是一個大概(個人認為更加不靠譜),比如一個人2050年12月30日出生,現(xiàn)在是2055年后的1月1號,那么按照年來說就是5,但是其實才4歲多一點,所以年這個只是一個大概的,不會十分準(zhǔn)確。