数据库是DB2的 certinum是身份证号
1select * from aa where convert(int,(year('2022')-substring(certinum,7,4)))>=60 错误-206
2select * from aa where (year(getdate())-substring(certinum,7,4)))>=60还是不行
应该怎么写呢?
select substr(t.user_code ,7,8)
from table t
where substr(t.user_code ,7,8) < (select to_char(sysdate - interval '60' year,'yyyyMMdd') from dual)
说明:substr(t.user_code ,7,8) 截取身份证号里面的出生日期
select to_char(sysdate - interval '60' year,'yyyyMMdd') from dual --> 获取当前时间减去60年的时间
substr(t.user_code ,7,8) < (select to_char(sysdate - interval '60' year,'yyyyMMdd') from dual) --> 判断条件
WHERE timestampdiff(year, substring(certinum,7,8),CURDATE()) > 60;
substring(certinum,7,4),这里得到是一个字符串吧,把它转成数字再做加减啊
字符串不能做减法,你这里也根本不涉及时间运算
直接转成int型再做减法
因为你标签写的是oracle,我先写了这个
select (trunc(sysdate)-to_date(substr('430123200010011234',7,8),'yyyymmdd'))/365.25 from dual;
实际上就是截取字符串,然后转成日期,oracle里的日期可以直接相减得到相差的天数,最后直接除以一年的天数就行了,但这里其实有个需求没有描述清楚,所谓的60岁,是指过了60岁生日之后才算60岁,还是只要当前年和出生年之间相差60年就算60岁?继续深究的话,每年的天数都不一样,这个问题会变得很复杂,所以我上面直接除了个每年天数的近似值
另外,DB2里虽然也可以to_date(substr('430123200010011234',7,8),'yyyymmdd') 这样写,但是由于它的单位不是天,因此直接相减不等于天,需要转成day再减
select trunc(sysdate),
to_date(substr('430123200010011234',7,8),'yyyymmdd'),
(days(sysdate)-days(to_date(substr('430123200010011234',7,8),'yyyymmdd')))/365.25 from SYSIBM.SYSDUMMY1;