CREATE?TABLE?test_chk_case_when?(
為項(xiàng)城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及項(xiàng)城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、項(xiàng)城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
id???int,
name?varchar(10),
sex??varchar(4),
age??int
);
--?男生年齡小于23歲,女生年齡小于21歲。
ALTER?TABLE?test_chk_case_when
ADD?CONSTRAINT?chk_test_sex_age
CHECK?(
??CASE?WHEN?sex='男'?AND?age23?THEN?1
???WHEN?sex='女'?AND?age21?THEN?1
???ELSE?0?END?=?1
);
SQL?INSERT?INTO?test_chk_case_when?VALUES(1,?'張三',?'男',?22);
已創(chuàng)建?1?行。
SQL?INSERT?INTO?test_chk_case_when?VALUES(2,?'李四',?'男',?23);
INSERT?INTO?test_chk_case_when?VALUES(2,?'李四',?'男',?23)
*
ERROR?位于第?1?行:
ORA-02290:?違反檢查約束條件?(TEST.CHK_TEST_SEX_AGE)
SQL?INSERT?INTO?test_chk_case_when?VALUES(3,?'王五',?'女',?20);
已創(chuàng)建?1?行。
SQL?INSERT?INTO?test_chk_case_when?VALUES(4,?'趙六',?'女',?21);
INSERT?INTO?test_chk_case_when?VALUES(4,?'趙六',?'女',?21)
*
ERROR?位于第?1?行:
ORA-02290:?違反檢查約束條件?(TEST.CHK_TEST_SEX_AGE)
根據(jù)出生日期查詢年齡用的還挺多的。
簡(jiǎn)單分析一下,加入一個(gè)孩子五歲半了,那習(xí)慣認(rèn)為他還是5歲。
用Oracle提供的months_between()函數(shù),先獲取出生日期和當(dāng)前日期的月數(shù),然后除以12向下取整:
使用的時(shí)候,將時(shí)間段替換成出生日期對(duì)應(yīng)的字段即可。
如果,計(jì)算年齡用的次數(shù)非常多,最好寫(xiě)成自定義函數(shù)。
SELECT COUNT(CASE WHEN AGE BETWEEN 1 AND 30 THEN 1 ELSE 0 END) AS 1-30歲
,COUNT(CASE WHEN AGE BETWEEN 31 AND 50 THEN 1 ELSE 0 END) AS 31-50歲
,COUNT(CASE WHEN AGE 50 THEN 1 ELSE 0 END) AS 50以上
FROM TABLE_NAME;
這個(gè)語(yǔ)句就可以做到~
可用to_char函數(shù)將date類型轉(zhuǎn)成字符類型。
如emp表中有如下數(shù)據(jù):
如果計(jì)算生日的方法是當(dāng)前日期的年份減去生日的年份,可用如下語(yǔ)句:
select?ename,hiredate,to_char(sysdate,'yyyy')-to_char(hiredate,'yyyy')?from?emp;
查詢結(jié)果:
用month_between做,應(yīng)該會(huì)好一些。
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)和修改了。
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)前日期的年份