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

 我来答
庆梧申尔云
2019-04-28 · TA获得超过3848个赞
知道小有建树答主
回答量:3040
采纳率:28%
帮助的人:214万
展开全部
#include
"stdio.h"
void
main()
{
int
i;
/*身份证的第i位*/
int
s[17];
/*定义一个数组用来存放身份证的前17位*/
int
t[17];
/*各位相乘后的数组*/
int
m;
/*余数*/
int
t18;
/*身份证的第18位0--9*/
char
t18c;
/*身份证的第18位X*/
long
int
sum=0;
for(i=0;i<17;i++)
{
printf("请输入身份证的第%d位:",i+1);
scanf("%d",&s[i]);
switch(i+1)
{
/*身份证的1到17位要乘的数一次是7
9
10
5
8
4
2
1
6
3
7
9
10
5
8
4
2
*/
case
1:t[i]=s[i]*7;break;
case
2:t[i]=s[i]*9;break;
case
3:t[i]=s[i]*10;break;
case
4:t[i]=s[i]*5;break;
case
5:t[i]=s[i]*8;break;
case
6:t[i]=s[i]*4;break;
case
7:t[i]=s[i]*2;break;
case
8:t[i]=s[i]*1;break;
case
9:t[i]=s[i]*6;break;
case
10:t[i]=s[i]*3;break;
case
11:t[i]=s[i]*7;break;
case
12:t[i]=s[i]*9;break;
case
13:t[i]=s[i]*10;break;
case
14:t[i]=s[i]*5;break;
case
15:t[i]=s[i]*8;break;
case
16:t[i]=s[i]*4;break;
case
17:t[i]=s[i]*2;break;
}
sum=sum+t[i];
}
printf("前17位相乘后的和为%ld\n",sum);
m=sum%17;
printf("对17取余后的值位:",m);
switch(m)
{
/*各个余数所对应第18位身份证号1
0
X
9
8
7
6
5
4
3
2*/
case
0:t18=1
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
1:t18=0
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
2:t18c='X';printf("这是一个合法的身份证号码,第18位是%c",t18c);break;
case
3:t18=9
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
4:t18=8
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
5:t18=7
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
6:t18=6
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
7:t18=5
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
8:t18=4
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
9:t18=3
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case
10:t18=2
;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
default:printf("这不是一个合法的身份证号码");
}
printf("\n");
}
兴义焦亦绿
2019-04-22 · TA获得超过3816个赞
知道大有可为答主
回答量:3118
采纳率:26%
帮助的人:473万
展开全部
你截出来的是19810101,这个不能直接做时间处理,要单独截1981,01,01,然后拼接成1981-01-01,才可以做数据类型转换。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鲜双乐冬莲
2020-06-21 · TA获得超过3866个赞
知道大有可为答主
回答量:3167
采纳率:26%
帮助的人:172万
展开全部
select
a.身份证号,b.身份证号
from
新身份证表
a,旧身份证表
b
where
substring(a.身份证号,1,6)=substring(b.身份证号,1,6)
and
substring(a.身份证号,9,9)=substring(b.身份证号,7,9)
最后一个是验证位,估计用不上吧?
上边也有可能我数错了,你改一下就好,知道substring的用法吧?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
姚妞衅和雅
2020-07-11 · TA获得超过3903个赞
知道大有可为答主
回答量:3031
采纳率:32%
帮助的人:222万
展开全部
(1)截取第七、八位数没有错
(2)错就错在as
datetime错误。
截取获得的两位数字不可能转成时间格式。只能转成int、string或者varchar格式
(3)改正方法:把as
datetime改成as
int
或者改成as
varchar
望采纳!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
初雍冠从波
2019-04-03 · TA获得超过3713个赞
知道大有可为答主
回答量:3081
采纳率:30%
帮助的人:217万
展开全部
说明:
1、用
(SUBSTRING
(身份证号码,
7,
4)
+
'-'
+
SUBSTRING
(身份证号码,
11,
2)
+
'-'
+
SUBSTRING
(身份证号码,
13,
2)

可以提取生日,不信你可以提一下自己的身份证测试
2、批量提取的前提是:
(1)所有需要提取的身份证都是18位
(2)所有身份证的第11-12位不能大于12,例如‘534517198513012241’这样的身份证出现时,会导致你整个身份证提取报错。因为你给出生日期列设置的是date格式,在SQL里面date格式是禁止出现13月的,超出了正常日期。
(3)同理可知,所有身份证的第13-14位不能大于31,例如‘534517198512412241’这样的身份证出现时,也会导致你整个身份证提取报错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式