各位兄弟都来,如何在sql里利用身份证查询出生日期?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各位兄弟都来,如何在sql里利用身份证查询出生日期?相关的知识,希望对你有一定的参考价值。

在SQL里,我有一个表叫养老表,里面有这几列
姓名 居民身份号码 离退休日期
李四 有15位的 1998-09-08
………… 有18位的 …………
………… 有末尾是X的 ………………
大概就是这,请问如何利用sql语句查询出生日期,并且计算出他们退休时的年龄,关键是各样的身份证都有,头都大了!

select 序号,姓名,身份证号,
case LEN(身份证号)
when 15 then convert(date, SUBSTRING(身份证号, 7, 6), 12) /*15位身份证号: 7-12位为yymmdd */
when 18 then convert(date, SUBSTRING(身份证号, 7, 8), 112) /*18位身份证号: 7-14位为yyyymmdd */
else NULL
end as 出生日期,
case LEN(身份证号)
/*身份证号出生日期后3位, 如果为奇数则性别为男, 55岁退休; 如果为偶数则为女, 50岁退休*/
when 15 then dateadd(year, case convert(int, SUBSTRING(身份证号,15,1))%2 when 1 then 55 else 50 end, convert(date, SUBSTRING(身份证号, 7, 6), 12) )
when 18 then dateadd(year, case convert(int, SUBSTRING(身份证号,17,1))%2 when 1 then 55 else 50 end, convert(date, SUBSTRING(身份证号, 7, 8), 112) )
else NULL
end as 退休日期
from 养老表
参考技术A 身份证只有15和18位的区分
按照你的要求做了一下简单的表
CREATE TABLE TEST_TAB
(
NAME VARCHAR2(60),
IDENTIFID VARCHAR2(30),
LEAVEDATE DATE
)

select a.NAME,
round((a.LEAVEDATE - to_date(substr(a.IDENTIFID,7,8),'yyyy/mm/dd'))/365)||'歳' ||
round(mod(((a.LEAVEDATE - to_date(substr(a.IDENTIFID,7,8),'yyyy/mm/dd'))/365),1)*12)||'月' ||
round(mod(mod(((a.LEAVEDATE - to_date(substr(a.IDENTIFID,7,8),'yyyy/mm/dd'))/365),1)*12,1)*10) ||'天' from
(
select NAME ,IDENTIFID , LEAVEDATE
from TEST_TAB
where length(IDENTIFID)=18
) a
union all
select a.NAME,
round((a.LEAVEDATE - to_date(concat('19',substr(a.IDENTIFID,7,6)),'yyyy/mm/dd'))/365)||'歳' ||
round(mod(((a.LEAVEDATE - to_date(concat('19',substr(a.IDENTIFID,7,6)),'yyyy/mm/dd'))/365),1)*12)||'月' ||
round(mod(mod(((a.LEAVEDATE - to_date(concat('19',substr(a.IDENTIFID,7,6)),'yyyy/mm/dd'))/365),1)*12,1)*10) ||'天' from
(
select NAME ,IDENTIFID , LEAVEDATE
from TEST_TAB
where length(IDENTIFID)=15
) a

因为没有考虑到性能问题。估计还得改善
参考技术B 和末尾没关系吧,最多判断下15位和18位

SELECT case when length(column)=18 then substring(column,7,8)
when length(column)=15 then concat('19',substring(column,7,6))
else '身份证号码不规范'
end
FROM TABLE

其中column是身份证号码字段 TABLE 是表名

算出出生年月,算退休就是加55年还是50年吧。这个加法太简单就不写了

如何在数据库中利用sql从18位身份证号中截取出生日期,身份证号在reader表中

sqlserver:
select substring(身份证号,7,8) from reader

oracle:
select substr(身份证号,7,8) from reader
参考技术A 如果是以CHAR格式存储的话可以考虑使用SUBSTRING函数,比如说SUBSTRING(ID,7,8)就是从第七个字符开始取8个字符。 参考技术B 用记录集操作吧

以上是关于各位兄弟都来,如何在sql里利用身份证查询出生日期?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中身份证编码与出生日期验证

在EXCELL里输入身份证号后,怎样利用函数提取性别,生日呢?

sql从身份证中取出出生日期

sql 从身份证中自动获取出生日期,显示格式为XXXX-XX-XX

sql中判断身份证号码的出生年月是不是正确合法

sqlserver如何将身份证号码的出生日期提取出来转为日期类型数据?