需求:有个personinfo表
字段 :生日BIRTHDAY date类型
字段:身份证号 CARD VARCHAR2(30)
把数据库中生日全部根据身份证号截取的日期更新
//18位
UPDATE PERSONINFO k SET k.CARD='410725199301021256'
//15位
UPDATE PERSONINFO k SET k.CARD='421022881006452'
sql语句:
//18位
UPDATE PERSONINFO t SET t.BIRTHDAY="TO_DATE"(("SUBSTR"(t.CARD, 7, 8)), 'yyyy-MM-dd') WHERE t.id IN ( SELECT k.id FROM PERSONINFO k WHERE "LENGTH"(k.CARD)=18)
//15位
UPDATE PERSONINFO t SET t.BIRTHDAY="TO_DATE"((CONCAT(19,"SUBSTR"(t.CARD, 7, 6))), 'yyyy-MM-dd') WHERE t.id IN ( SELECT k.id FROM PERSONINFO k WHERE "LENGTH"(k.CARD)=15)
扩展知识:(18位)
号码的结构和表示形式
1.号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2.地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3.出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4.顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5.校验码
根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
地址码
第一位数字表示地区,1是华北,2 是东北,3是华东,4是中南,5是西南,6是西北。
第二位数字表示户籍地所在的直辖市、省、自治区在该地区中的排位,比如在华北地区,1代表北京市,2代表天津市,3代表河北省,4代表山西省,5代表内蒙古自治区。
第三、四位数字在户籍所在地是省、自治区的身份证号码中表示所在地的地区或地区级市(省辖市)、盟,在户籍地是直辖市的身份证号码中表示所在地的归属,01是城市,02是农村。
15位的身份证号码: (1)1~6位为地区代码 (2)7~8位为出生年份(2位),9~10位为出生月份,11~12位为出生日期 (3)第13~15位为顺序号,并能够判断性别,奇数为男,偶数为女。