年齡段統(tǒng)計(jì)可用case when 語(yǔ)句。
創(chuàng)新互聯(lián)公司長(zhǎng)期為超過(guò)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為當(dāng)涂企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站,當(dāng)涂網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
如test表中有以下數(shù)據(jù):
其中18-29歲為青年,30-49歲為中年,50歲以上為老年,先統(tǒng)計(jì)各個(gè)年齡段人數(shù),可用如下語(yǔ)句:
select?case?when?age?between?18?and?29?then?'青年'?when?age?between?30?and?59?then?'中年'?when?age=60?then?'老年'?end?as?年齡段,
count(*)?as?人數(shù)?
from?test
group?by?case?when?age?between?18?and?29?then?'青年'?when?age?between?30?and?59?then?'中年'?when?age=60?then?'老年'?end;
統(tǒng)計(jì)結(jié)果:
根據(jù)出生日期查詢年齡用的還挺多的。
簡(jiǎn)單分析一下,加入一個(gè)孩子五歲半了,那習(xí)慣認(rèn)為他還是5歲。
用Oracle提供的months_between()函數(shù),先獲取出生日期和當(dāng)前日期的月數(shù),然后除以12向下取整:
使用的時(shí)候,將時(shí)間段替換成出生日期對(duì)應(yīng)的字段即可。
如果,計(jì)算年齡用的次數(shù)非常多,最好寫成自定義函數(shù)。
這個(gè)辦法很多,如果是比較精確的可以用month_between函數(shù),然后除以12,最后在trunc這樣就能得到具體的年齡了。
比如trunc(month_between(sysdate,時(shí)間類型的生日字段)/12)
個(gè)人感覺這個(gè)精確一些,能精確到天,只要還沒(méi)過(guò)生日,那么就不會(huì)加一歲。
當(dāng)然二者直接相減trunc((sysdate-時(shí)間類型的生日字段)/365)也可以。
sysdate-時(shí)間類型的生日字段,這么相減默認(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)確。
SELECT ROUND(MONTHS_BETWEEN(SYSDATE,PBIRTHDAY)/12) age FROM MEMB_OF_BEDROOM;(其中PBIRTHDAY是你表的那個(gè)時(shí)期列名,如果你給的設(shè)計(jì)結(jié)構(gòu)中名稱是真實(shí)的物理代碼名稱的話。。)。
順道提醒兩點(diǎn):
1.請(qǐng)確定“T.生日”中的生日一列是否真實(shí)存在,一般情況下,處于后期隱患考慮,不建議用中文來(lái)定義列名?!吧铡弊詈糜胏omment的形式進(jìn)行列別名注釋;
2.getdate()印象中不是oracle的內(nèi)置sql函數(shù),year函數(shù)亦同(除非是自己書寫的存儲(chǔ)函數(shù)),我妄測(cè)是講某高級(jí)編程語(yǔ)言生搬過(guò)來(lái)而成。 (一般sql查詢語(yǔ)句在分析時(shí),只分析其內(nèi)在支持的函數(shù)和變量,不屬于其內(nèi)在支持的函數(shù)和變量以及非關(guān)鍵字一律當(dāng)做字符串處理,不負(fù)責(zé)調(diào)用和編譯)
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)前日期的年份