回 帖 发 新 帖 刷新版面

主题:跳过不合法的日期——身份证提取年月日

     birthday是日期型,idcd是字符型,是身份证号码,问题是身份证号码不都是正确的。用下面语句时会出错,提示“函数参数的值、类型或数目无效”。原因是身份证号码错了,导致年月日不合法,比如有个错误的18位身份证号码440721964030660220,正确日期应是1964.03.06。但由于是错的,函数得出的是9640-30-66,显然是非法的。我想遇到这种非法的日期就跳过不处理,直接处理下一个。数据已导入表中了,有30多万条记录。怎样跳过不合法的呢,即不合法的不处理,直到处理完所有的其它的。
   SET DATE ANSI
   SET CENTURY on

   REPLACE birthday with DATE(VAL('19'+SUBSTR(idcd,7,2)),VAL(SUBSTR(idcd,9,2)),VAL(SUBSTR(idcd,11,2))) for LEN(alltrim(idcd))=15

   或REPLACE birthday with DATE(VAL(SUBSTR(idcd,7,4)),VAL(SUBSTR(idcd,11,2)),VAL(SUBSTR(idcd,13,2))) for LEN(alltrim((idcd))=18

回复列表 (共8个回复)

沙发

最好能上传数据表的相关内容
参考下帖的内容:[url=http://blog.csdn.net/lygcw9602/article/details/7319339]http://blog.csdn.net/lygcw9602/article/details/7319339[/url]
该帖内容可以改为自定义函数

板凳

比如有个错误的身份证号码440721964030660220,这个是18位的,正确日期应是1964.03.06。但由于是错的,函数得出的是9640-30-66,显然是非法的。我想遇到这种非法的日期就跳过不处理,直接处理下一个。
数据已导入表中了,有30多万条记录。

3 楼

cbl518、jinlonggao、lwh1188、foxdb...大家都跑了,论坛很冷清呀,不来这段时间真的变了么。

4 楼

你的数据表在那里?
上传身份证号部分数据

5 楼

活人叫尿憋死了。

月份不对,你把日期变成XXXX-01-01

日错误,你把日期变成XXXX-XX-01


然后提示某某人身份证号错误,并且建立日志备查。

6 楼

5楼能详解一下么

7 楼

身份证的位数很长,录入时难免出错,因此,首先校核身份证号是否准确,校核通过之后,你再提取出生时间,校核未通过的,提示用户:身份证号错误,请联系该人,报来准确的号码。

  15位的身份证号,你自己写校核程序。18位的身份证号,按公安部的规定算法写校核程序,本论坛中就有。

  录入错误时技术问题,你可以在程序中提示用户:录错了。
  收集到错误的身份证号码,是管理问题,你很难用技术来圆满地解决。在你的例子中,行政区划代码少了1位,有校核功能的软件,会提示身份证号不对,如果你一定要从错误的身份证号码提前出生时间,那么你就把不能正确提取的号码列出,手工干预。

8 楼

   打开“工具”-“选项”,点中“区域”标签,把日期格式改为“短格式”,然后执行以下语句,完美解决:
   REPLACE ALL birthday WITH CTOD(SUBSTR(idcd,7,4)+"-"+SUBSTR(idcd,11,2)+"-"+SUBSTR(idcd,13,2)) FOR LEN(ALLTRIM(idcd))=18
   REPLACE ALL birthday WITH CTOD("19"+SUBSTR(idcd,7,2)+"-"+SUBSTR(idcd,9,2)+"-"+SUBSTR(idcd,11,2)) FOR LEN(ALLTRIM(idcd))=15
   注意ctod函数中的日期字符串格式要和表中的格式相一致,如表中的格式为短格式("1997-8-5"),身份证中为19970805,要把它改成1997-08-05,再ctod("1997-08-05")=1997-8-5。当ctod函数里的日期字符不合法时,返回.F.,即不作转换处理。
   至于身份证校验,本人刚从网上找到了一个函数,迟点上传,大家共享。

我来回复

您尚未登录,请登录后再回复。点此登录或注册