随笔 - 103  文章 - 2 评论 - 919 trackbacks - 21
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789


转载请保留链接。
国际管理VS中国国情链接 8-21 13:48

与我联系

搜索

 

常用链接

留言簿(12)

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

相册

最新随笔

积分与排名

  • 积分 - 146166
  • 排名 - 248

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

使用t-sql从身份证号中提取生日,一下是转换16位身份证号的例子,仅供参考。
create function getDateFromID(
    
@id char(15)
)
returns datetime
as
begin
    
declare @birthPart char(6);
    
set @birthPart = substring(@id,7,6);
    
declare @year int;
    
set @year = cast(left(@birthPart,2as int);
    
if @year < 10 
    
SET @year = 2000 + @year;
    
else
    
SET @year = 1900 + @year;

    
declare @birthday datetime;
    
set @birthday = cast(cast(@year as char(4)) + '-' 
        
+ substring(@birthpart,3,2+ '-'
        
+ substring(@birthpart,6,2as datetime)
    
return @birthday
end
GO
declare @id char(16)
set @id = '510106830328511';
print dbo.getDateFromID(@id)
Tag标签: sql,t-sql
posted on 2008-05-22 16:56 玉开 阅读(398) 评论(5)  编辑 收藏 所属分类: 数据库

FeedBack:
#1楼  2008-05-22 17:10 Cheney Shue      
身份证有16位的吗?


顺便附带Oracle下判断和读取18位和15位身份证号生日的方法
select
case when regexp_like(ltrim(rtrim(ID_NUM)),'^[[:digit:]]{17}([[:digit:]]|x|X)$') then to_date(substr(ltrim(rtrim( ID_NUM)),7,8),'YYYYMMDD') when regexp_like(ltrim(rtrim(ID_NUM)),'^[[:digit:]]{15}$') then to_date('19' || substr(ltrim(rtrim(ID_NUM)),7,6),'YYYYMMDD')
end as Birthday

from Table


  回复  引用  查看    
#2楼 [楼主] 2008-05-22 17:17 玉开      
@Cheney Shue
应该是15位 3Q;Oracle很强大,sql server 2005可以用clr函数做类似实现
  回复  引用  查看    
#3楼  2008-06-16 22:30 SPARON      
呵呵,感谢玉开,我来晚了。
  回复  引用  查看    
#4楼  2008-07-05 03:42 深蓝      
楼主是成都人吗?我觉得楼主
if @year < 10
SET @year = 2000 + @year;
else
SET @year = 1900 + @year;
这句是多余的,在中国根本不会出现这种情况。国家就是为了防止出现这种判断才将身份证升到18位的。
  回复  引用  查看    
#5楼 [楼主] 2008-07-07 12:28 玉开      
@深蓝
我不是成都人,谢谢你的回复。
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-22 17:18 编辑过
 
历史上的今天: