以身份证号判断户籍.

怪众生太美丽 2011-08-23 12:13:11
如题,我想知道以下这段代码中的@acity为何那样构造,
有什么根据么?谢谢,谢谢...

create function f_getcityfromcid (@cid varchar(18))
returns varchar(50)
as
begin

declare @acity varchar(1000)
set @acity = '____,____,____,____,____,____,____,____,____,____,____,北京__,天津__,河北__,山西__,内蒙古_,____,____,____,____,____,辽宁__,吉林__,黑龙江_,____,____,____,____,____,____,____,上海__,江苏__,浙江__,安微__,福建__,江西__,山东__,____,____,____,河南__,湖北__,湖南__,广东__,广西__,海南__,____,____,____,重庆__,四川__,贵州__,云南__,西藏__,____,____,____,____,____,____,陕西__,甘肃__,青海__,宁夏__,新疆__,____,____,____,____,____,台湾__,____,____,____,____,____,____,____,____,____,香港__,澳门__,____,____,____,____,____,____,____,____,国外__,'


set @cid = upper(@cid)

IF (len(@cid) <> 18 OR patindex('%[^0-9X]%',@cid) > 0)
RETURN '你小子骗我,这不是合法的身份证'

IF substring(@acity,cast(left(@cid,2) as int)* 5+1,4) = ''
RETURN '你小子骗我,这身份证的地区码不存在'


RETURN '这小子是:'+replace(substring(@acity,cast(left(@cid,2) as int)* 5+1,4),'_','')

end
go

select dbo.f_getcityfromcid('350322198904026538')
/*
--------------------------------------------------
你小子骗我,这不是合法的身份证

(所影响的行数为 1 行)

*/
select dbo.f_getcityfromcid('370481198502184293')
/*
--------------------------------------------------
这小子是:山东

(所影响的行数为 1 行)


*/
drop function f_getcityfromcid

...全文
576 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶子 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guoweifyj 的回复:]

亲,哪种规律?引用 3 楼 maco_wang 的回复:
和区号差不多,就是某种规律
[/Quote]
身份证上的编号
  1、号码的结构
  公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
  2、地址码(前六位数)
  表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
  地址码的编码规则为:第一位表示地区,1-华北、2 -东北、3-华东、4-中南、5-西南、6-西北,这样各省编码为 11 北京市、12 天津市、13 河北省、14 山西省、15 内蒙古自治区;21 辽宁省、22 吉林省、23 黑龙江省;31 上海市、32 江苏省、33 浙江省、34 安徽省、35 福建省、36 江西省、37 山东省;41 河南省、
  42 湖北省、43 湖南省、44 广东省、45 广西壮族自治区、46 海南省;50 重庆市、51 四川省、52 贵州省、
  53 云南省、54 西藏自治区;61 陕西省、62 甘肃省、63 青海省、64 宁夏回族自治区、65 新疆维吾尔自治区;71 台湾省、81 香港特别行政区、82 澳门特别行政区

  3、出生日期码(第七位至十四位)
  表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
  4、顺序码(第十五位至十七位)
  表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
  5、校验码(第十八位数)
  作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么
  此人的身份证就变成了19位。X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准
  其他说明:
  身份证上的数字编号,共有15位(新身份证号为18位).从左到右,开头6位数字,属行政区
  域代码,按层次每两位分别表示我国省(自治区,直辖市),地区(市,州,
  盟)和县(旗,镇,区)的名称.例如,头六位数字为420107,则42,01
  和07分别代表湖北省,武汉市和青山区.编号的第七位到第十二位(新身份证号为编号的第七位到第十四位),属出生
  日期号码,表示本人出生的年月日.例如,出生于1963年10月1日,这个
  数字便是631001.(新身份证号为19631001).第13—15位属分配顺序代码.(新身份证号第15-16位为顺序码)
  如第15位的这个数字.(新身份证号为第17位),男性用单数,女性用双数表示.此外,还有一个
  特殊规定,即末尾以 996, 997, 998和 999这四个号为百岁以上老人的特
  殊规定编号,它们不再分配给其他任何人.
gold_water 2011-08-23
  • 打赏
  • 举报
回复
比如前三位代表什么,4到6位表示什么。。。
怪众生太美丽 2011-08-23
  • 打赏
  • 举报
回复
亲,哪种规律?[Quote=引用 3 楼 maco_wang 的回复:]
和区号差不多,就是某种规律
[/Quote]
怪众生太美丽 2011-08-23
  • 打赏
  • 举报
回复

嘿嘿 半懂不懂糊里糊涂...
--小F-- 2011-08-23
  • 打赏
  • 举报
回复
为了

replace(substring(@acity,cast(left(@cid,2) as int)* 5+1,4),'_','')
叶子 2011-08-23
  • 打赏
  • 举报
回复
和区号差不多,就是某种规律
geniuswjt 2011-08-23
  • 打赏
  • 举报
回复
从相关部门扫描到的数据做的吧
AcHerat 2011-08-23
  • 打赏
  • 举报
回复
去看看身份证号的构成就知道了。
怪众生太美丽 2011-08-23
  • 打赏
  • 举报
回复

小眯了一会 结贴晚了...学习了..
wuzhibumian 2011-08-23
  • 打赏
  • 举报
回复
是有规律的我试过用身份证号做过性别判断。到网上找找一大堆

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧