这个问题要是给我解决了给钱都行,要不我就要被开除了,真的,各位实在帮帮忙!
我们单位用的数据库是oracle7.3
在职工基本信息表(ac01_t)中有身份证号码字段,当然身份证号码字段有的人是15位,有的人的身份证是18位,但从身份证号码中可以知道此人的出生日期,以及性别信息:
比如:这个身份证号码:210522741005001,可以得知此人的出生日期:1974-10-05
性别是(即身份证号码最后一位,奇数为男,偶数为女)男
如果是18位的身份证号:比如:210522196912060527,可以得知此人的
出生日期是:1969-12-06日,性别是(身份证号码的倒数第2位,即2)因为是偶数,所以是女;
读到这儿请不要急,还没到正题:
我的oracle数据库中的出生日期的字段类型是data型,即1960-10-06这样,而身份证号码字段是字符型:
我要实现根据身份证号码,用update语句批量更新出生日期和性别字段,当然首先要判断身份证号码的位数,然后.......
这个update语句该怎样写,谁能写出详细代码,有注释更好!
我将万分感谢!!
问题点数:100、回复次数:20Top
1 楼SilverSands(洞庭浪子)回复于 2004-08-02 17:50:54 得分 0
晕,你光顾的说了!
要怎么更新啊??Top
2 楼wxhacker(为了。。。)回复于 2004-08-02 17:57:52 得分 0
/////函数名 ~~~~~
参数 string ls_cardid
if isblank(ls_cardid) then return ''
if len(ls_cardid)<>15 and len(ls_cardid)<>18 then
return '身份证号必须是15或者18位'
end if
if len(ls_cardid)=15 then
if mod(integer(right(ls_cardid,1)),2)=1 then
return '男'
else
return '女'
end if
end if
if len(ls_cardid)=18 then
if mod(integer(mid(ls_cardid,17,1)),2)=1 then
return '男'
else
return '女'
end if
end if
update ...
循环调用改函数,得到所有人的性别
Top
3 楼liubocy(天道酬勤)回复于 2004-08-02 17:58:52 得分 0
简单啊,判断位数
15位的:
日期=mid(身份证号,7,6),得到的诸如'741005',再转成'1974-10-05'格式,
然后再用date()函数转类型。
性别也是用mid()函数取值。
别的位数的也差不多这么取,最后再update
Top
4 楼cgcfjxyjxy(c)回复于 2004-08-02 21:14:25 得分 0
同志们,我想用一条update语句写出我上面的要求,我要在sql/plus里能执行的.Top
5 楼Blue_Sea_2001(蓝色大海)回复于 2004-08-03 07:31:08 得分 0
sqlserver
/*create table biao
(id int IDENTITY(1,1) primary key,
shengfenzheng varchar(18),
chushengriqi datetime )
insert into biao (shengfenzheng) values ('362502770204204')
insert into biao (shengfenzheng) values ('362502197702042041')
*/
update biao set chushengriqi = case when len(shengfenzheng) = 15 then convert(datetime,substring(shengfenzheng,7,6),12)
else convert(datetime,substring(shengfenzheng,7,8),112)
end
select * from biaoTop
6 楼jackxrh()回复于 2004-08-03 09:18:21 得分 0
update table
set 出生 = decode(.......),
性别 = decode(.......)
忘记了 oracle 里的具体语法 ,你用上面的思路构建一下Top
7 楼liubocy(天道酬勤)回复于 2004-08-03 09:26:36 得分 0
还是建个存储过程吧Top
8 楼akeewww(akeewww)回复于 2004-08-03 09:31:44 得分 0
关键是Oracle的转换函数Top
9 楼yanudd((明明)(http://www.comejava.com)(中国java联盟))回复于 2004-08-03 09:37:29 得分 0
同意"Blue_Sea_2001(蓝色大海) "的说法,
呵呵,虽然一个小裤衩,却是个高手,呵呵
Top
10 楼benjaminz(RockDJ)回复于 2004-08-03 10:24:21 得分 0
学习oracle的方法Top
11 楼freedom2001(天翔)回复于 2004-08-03 11:16:17 得分 0
真受不了,人家明明问的是ORACLE,你却给列出个SQL SERVER的,差别大了去了。至于楼主的问题,我认为你只要花半天的时间好好看看书就搞定了。如果这都搞不定,说句不好听的,你被开掉的机会太大了Top
12 楼wxq1142(游虾)回复于 2004-08-03 11:17:49 得分 0
gz蓝色大海Top
13 楼visking(JYF)回复于 2004-08-03 13:43:42 得分 0
保险起见还是建个过程比较好.如果对oralce的sql不熟悉的话还是不要直接用sql写.o9i里面倒是有类似蓝色海洋这种写法的.o8i里面估计没有.还是写过程吧,化繁为简,一步一步来好了
Top
14 楼sun1976(嫁给我,你就是我的一妾)回复于 2004-08-03 14:19:06 得分 0
真的给钱吗?我交给你,不多要,人民币1分钱就可以了,请存入中国工商银行的这个帐号:
9558800200126214614 王艳民 或者
农业银行:9559980014204137815 王艳民
就是看看你的诚意
如果你把钱存进去了,我保证帮你完成任务,直接给你发源代码都行
现在先给你个提示:使用decode和length结合Top
15 楼sun1976(嫁给我,你就是我的一妾)回复于 2004-08-03 14:20:44 得分 0
再提醒一个:decode可以嵌套使用Top
16 楼dragoner()回复于 2004-08-03 17:28:57 得分 0
这一个很简单号Top
17 楼feeling_68(随风)回复于 2004-08-03 17:36:59 得分 0
同意sun1976(关羽观雨)Top
18 楼cuilk(clk)回复于 2004-08-03 20:21:50 得分 80
update ry_jbxx a set (a.csrq,a.xb)=(select decode(length(sfzhm),18,to_date(substr(sfzhm,7,8),'YYYY-MM-DD'),
15,to_date('19'||substr(sfzhm,7,6),'YYYY-MM-DD')),decode(length(sfzhm),18,substr(sfzhm,length(sfzhm)-1,1),
15,substr(sfzhm,length(sfzhm),1)) from ry_jbxx where a.sfzhm=sfzhm)
表名:ry_jbxx 列名:sfzhm为身份证号码 csrq为出生日期
xb为性别
Top
19 楼sywen(古道西风)回复于 2004-08-04 11:30:18 得分 20
update ac01_t
set出生日期= to_date(decode(length(身份證號),15,'19'||substr(身份證號,7,6),
substr(身份證號,7,8)),'yyyymmdd') ,
性別=decode(mod(to_number(decode(length(身份證號),15,substr(身份證號,15,1),
substr(身份證號,18,1))), 2),1,'男','女')
where card_id=身份證號;Top
20 楼wscft(努力工作,开心生活!))回复于 2004-08-05 09:43:36 得分 0
说句实在话, 这个问题一般般, 楼主这个问题要是解决不了的话,被开除也是正常的!Top




