有15位或18位身份
表结构这样的
xingming xingbie shenfenzhao
小王 男 130503670401001
小王2 女 130503690401001
小王3 男 320282197705474589
小王4 男 320282196505474589
能查询出按性别区分,女的年龄超过55周岁,男的年龄超过60周岁的人
------解决方案--------------------
with t as
(select 'xw1' nm, 'M' sex, '130503370401001' ID
FROM DUAL
UNION ALL
select 'xw2' nm, 'F' sex, '130503390401001' ID
FROM DUAL
UNION ALL
select 'xw3' nm, 'M' sex, '320282194705074589' ID
FROM DUAL
UNION ALL
select 'xw4' nm, 'M' sex, '320282196505174589' ID
FROM DUAL)
select *
from (select t1.*,
months_between(SYSDATE,
to_date(decode(len,
15,
'19'
------解决方案--------------------
substr(id, 7, 6),
18,
substr(id, 7, 8),
null),
'yyyymmdd')) / 12 birth
from (SELECT t.*, length(t.id) len FROM T) t1) t2
where (t2.sex = 'M' AND T2.BIRTH > 60)
OR (T2.SEX = 'F' AND T2.BIRTH > 55);
------解决方案--------------------
如果身份证都是合法的,就可以简单点(19770547实际上是非法日期)
SELECT XINGMING,
XINGBIE,
SHENFENZHAO,
TO_DATE(CASE
WHEN LENGTH(SHENFENZHAO) = 15 THEN
'19'
------解决方案--------------------
SUBSTR(SHENFENZHAO, 7, 6)
ELSE