今天写的Sql语句,对日期格式进行规范的.

    很长,还没写完,今天晚上要接着写.


     今天上午已把SQL写好,见下:  --By 2005-06-28

建造函数的SQL:   
create   function  CheckCharNum
-- 检测字符串中有几个字符,返回查找到的数量
--
比如 select dbo.CheckCharNum('-','2002-1-1') 就会返回2
(
    
@findStr   varchar ( 10 ),
    
@srcStr   varchar ( 30 )
)
returns   int
as
begin
    
declare   @num   int
    
declare   @site   int
    
set   @num = 0
    
set   @site   =   charindex ( @findStr , @srcStr , 0 -- 从开始找起
    
    
while   @site > 0
    
begin
        
set   @num      =      @num + 1
        
set   @site      =      charindex ( @findStr , @srcStr , @site + 1 )
    
end
    
return   @num
end
go

create   function  CheckIsNum   -- 检测一个字符串是不是一整数
(
    
@value   varchar ( 20 )
)
returns   int
as
begin
    
declare   @isNum   int
    
if   charindex ( ' . ' , @value ) = 0   and   isNumeric ( @value ) = 1
        
set   @isNum = 1
    
else
        
set   @isNum = 0

    
return   @isNum
end
go

-- 1999..2.2
--
update pi_CZRKDJB set birth=replace(birth,'..','.') where charindex('..',birth)>0

-- 1999.2.2 0:0
--
update pi_CZRKDJB set birth=replace(birth,' 0:0','') where charindex(' 0:0',birth)>0

-- 字符长度为1
--
update pi_CZRKDJB set birth='' where len(birth)=1


-- 字符长度为2,建造函数
create   function  SetTwoChar
(
    
@datestr   varchar ( 2 )
)
returns   varchar ( 4 )
as
begin
    
declare   @retvalue   varchar ( 4 )
    
if   isNumeric ( @datestr ) = 1
    
begin
        
set   @retvalue = ' 19 ' + @datestr + ' -01-01 '   -- 1999-01-01
     end

    
else
    
begin
        
set   @retvalue = ''
    
end
    
return   @retvalue
end
go
-- 对字符长度为2的日期进行格式化.
--
update pi_CZRKDJB set birth=dbo.SetTwoChar(birth) where len(birth)=2


-- 字符长度为3,建造函数
create   function  SetThreeChar
(
    
@Datestr   varchar ( 3 )
)
returns    varchar ( 10 )
as
begin
    
declare   @formatdate   varchar ( 10 )
    
if   charindex ( ' . ' , @DateStr ) > 0   -- 如果是56.这种格式,则变为1956.01.01
     begin
        
set   @formatdate      = ' 19 ' + substring ( @Datestr , 1 , 2 ) + ' -01-01 '
    
end

    
else    -- 如果是35岁这种格式
     begin
        
set   @formatdate = ''
    
end
    
return   @formatdate
end
go

--
--
对字符长度为3的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetThreeChar(birth) where len(birth)=3


-- 字符串长度为4,建造函数
create   function  SetFourChar
(
    
@Datestr   varchar ( 4 )
)
returns    varchar ( 10 )
as
begin
    
declare   @formatdate   varchar ( 10 )
    
declare   @leftstr   varchar ( 4 )
    
declare   @rightstr   varchar ( 4 )
    
declare   @split      int
    
set   @formatdate = ''
    
if   charindex ( ' . ' , @DateStr ) > 0   -- 如果是56.1这种格式,则变为1956.01.01
     begin
        
set   @split      =      charindex ( ' . ' , @DateStr )
        
set   @leftstr      =      substring ( @DateStr , 1 , @split - 1 )
        
set   @rightstr      =      substring ( @DateStr , @split + 1 , len ( @DateStr ))
        
if  dbo.CheckIsNum( @leftstr ) = 1   and  dbo.CheckIsNum( @rightstr ) = 1
        
begin
            
set   @formatdate      =      ' 19 ' + @leftstr + ' -0 ' + @rightstr + ' -01 '
        
end
        
else
        
begin
            
set   @formatdate      =      ''
        
end
    
end

    
else    -- 如果是1956这种格式
     begin
        
if  dbo.CheckIsNum( @Datestr ) = 1
            
set   @formatdate = @Datestr + ' -01-01 '
        
else
            
set   @formatdate = ''
    
end

    
return   @formatdate
end
go

-- 对字符长度为4的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetFourChar(birth) where len(birth)=4


-- 字符串长度为5,建造函数
create   function  SetFiveChar
-- 长度为5的格式有:61.11 ,47.3.,1956.,1927年,19885,199.7,61/11
(
    
@DateStr   varchar ( 5 )
)
returns   varchar ( 10 )
as
begin
    
declare   @formatdate   varchar ( 10 )
    
if   charindex ( ' . ' , @DateStr ) > 0      -- 如果有.的话,只可能位置在3与5是正确的
     begin
        
if   charindex ( ' . ' , @DateStr ) = 3   --   '77.12'这种格式
             set   @formatdate      =      ' 19 ' + substring ( @DateStr , 1 , 2 ) + ' - ' + substring ( @DateStr , 4 , 2 ) + ' -01 '     
        
else   if   charindex ( ' . ' , @DateStr ) = 5   -- 1999.这种格式
             set   @formatdate      =      substring ( @DateStr , 1 , 4 ) + ' -01-01 '
        
else
            
set   @formatdate      =      ''
    
end
    
    
else   
    
begin
        
if   charindex ( ' / ' , @DateStr ) = 3    -- 57/12这种格式
             set   @formatdate      =      ' 19 ' + substring ( @DateStr , 1 , 2 ) + ' - ' + substring ( @DateStr , 4 , 2 ) + ' -01 '     
        
else
            
set   @formatdate = ''
    
end
    
return   @formatdate
end
go

-- --对字符长度为5的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetFiveChar(birth) where len(birth)=5



-- 字符串长度为6,建造函数
create    function  SetSixChar
-- 长度为6的格式有:1960.9 , 98.4.6 ,1960-4 , 71/1/8, 1931/7 , 194702 ,1970。2
(
    
@DateStr   varchar ( 6 )
)
returns   varchar ( 10 )
as
begin
    
declare   @formatdate   varchar ( 10 )
    
    
-- 提出1960.1 1960-1 1960/1 这种格式
     if  dbo.CheckCharNum( ' - ' , @DateStr ) = 1   or  dbo.CheckCharNum( ' . ' , @DateStr ) = 1   or  dbo.CheckCharNum( ' / ' , @DateStr ) = 1
        
set   @formatdate      =      substring ( @DateStr , 1 , 4 ) + ' -0 ' + substring ( @DateStr , 6 , 1 ) + ' -01 '
    

    
-- 提出48.2.1 48/2/1 48-2-1这种格式
     else
    
begin  
    
if  dbo.CheckCharNum( ' - ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' . ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' / ' , @DateStr ) = 2
        
set   @formatdate      =      ' 19 ' + substring ( @DateStr , 1 , 2 ) + ' -0 ' + substring ( @DateStr , 4 , 1 ) + ' -0 ' + substring ( @DateStr , 6 , 1 )
    
else
        
set   @formatdate      =      ''
    
end
    
    
return   @formatdate
end
go
-- 对字符长度为6的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetSixChar(birth) where len(birth)=6




-- 字符串长度为7,建造函数
create   function  SetSevenChar
-- 长度为7的格式有:1960.11 , 1955.02 , 57.11.7 ,64.1.22 ,1957-09 , 74/9/18,1997年9月, 1963/11 
(
    
@DateStr   varchar ( 7 )
)
returns   varchar ( 10 )
as
begin
    
declare   @formatdate   varchar ( 10 )
    
if  dbo.CheckCharNum( ' . ' , @DateStr ) = 1   or  dbo.CheckCharNum( ' - ' , @DateStr ) = 1   or  dbo.CheckCharNum( ' / ' , @DateStr ) = 1   -- 如果是1960.11 1955.02 1960-11 1960/11这种格式
     begin
        
if  dbo.CheckIsNum( substring ( @DateStr , 1 , 4 )) = 1  
            
set   @formatdate = substring ( @DateStr , 1 , 4 ) + ' - ' + substring ( @DateStr , 6 , 2 ) + ' -01 '
        
else
            
set   @formatdate = ''
    
end  
    
    
else   if  dbo.CheckCharNum( ' . ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' / ' , @DateStr ) = 2   -- 如果是51.7.17 , 51.11.7  51/11/2 这种格式
     begin
        
if  dbo.CheckIsNum( substring ( @DateStr , 4 , 2 )) = 1   -- 表示51.11.7  51/11/7这种格式
             set   @formatdate = ' 19 ' + substring ( @DateStr , 1 , 2 ) + ' - ' + substring ( @DateStr , 4 , 2 ) + ' -0 ' + substring ( @DateStr , 7 , 1 )
        
else    -- 表示51.1.17  51/1/17这种格式
             set   @formatdate = ' 19 ' + substring ( @DateStr , 1 , 2 ) + ' -0 ' + substring ( @DateStr , 4 , 1 ) + ' - ' + substring ( @Datestr , 6 , 2 )
    
end
    
    
else   if   charindex ( ' ' , @DateStr ) > 0    -- 表示1969年2月
     begin
        
set   @formatdate = substring ( @DateStr , 1 , 4 ) + ' -0 ' + substring ( @DateStr , 6 , 1 ) + ' -01 '
    
end
    
    
else
        
set   @formatdate = ''

    
return   @formatdate
end
go
-- 对字符长度为7的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetSevenChar(birth) where len(birth)=7



create   function  SetEightChar
-- 长度为8的格式有:1931.6.9 78.11.20 1956-8-4 50/12/19 1950-5-6
(
 
@DateStr   varchar ( 8 )
)
returns   varchar ( 10 )
as
begin
 
declare   @formatdate   varchar ( 10 )
 
if   dbo.CheckCharNum( ' - ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' . ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' / ' , @DateStr ) = 2  
 
begin
  
if  dbo.CheckIsNum( substring ( @DateStr , 1 , 4 )) = 1  
-- 如果是1940.7.6 1940/7/6 1940-7-6
        set   @formatdate = substring ( @DateStr , 1 , 4 ) + ' -0 ' + substring ( @DateStr , 6 , 1 ) + ' -0 ' + substring ( @DateStr , 8 , 1 )
  
else   if  dbo.CheckIsNum( substring ( @DateStr , 1 , 2 )) = 1   and  dbo.CheckIsNum( substring ( @DateStr , 4 , 2 )) = 1   -- 如果是40-12-30 40/12/30这种格式
       set   @formatdate = ' 19 ' + substring ( @DateStr , 1 , 2 ) + ' - ' + substring ( @DateStr , 4 , 2 ) + ' - ' + substring ( @DateStr , 7 , 2 )
  
else
   
set   @formatdate = ''
 
end
 
else
  
set   @formatdate = ''
 
return   @formatdate
end
go

-- 对字符长度为8的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetEightChar(birth) where len(birth)=8



-- 字符串长度为9,建造函数
create   function  SetNineChar
-- 长度为9的格式有:1931.12.9 1931.1.19 1931-12-9 1931-1-19 1950年1月9号 198510.31
(
 
@DateStr   varchar ( 9 )
)
returns   varchar ( 10 )
as
begin
 
declare   @formatdate   varchar ( 10 )
 
if   dbo.CheckCharNum( ' - ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' . ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' / ' , @DateStr ) = 2   -- 1931.12.9 1931.1.19 1931-12-9 1931-1-19
      begin
          
if  dbo.CheckIsNum( substring ( @DateStr , 1 , 4 )) = 1  
           
begin
            
if  dbo.CheckIsNum( substring ( @DateStr , 6 , 2 )) = 1    -- 1931.12.9 1931-12-9 1931/12/9
                 set   @formatdate      =      substring ( @DateStr , 1 , 4 ) + ' - ' + substring ( @DateStr , 6 , 2 ) + ' -0 ' + substring ( @DateStr , 9 , 1 )
            
else   if  dbo.CheckIsNum( substring ( @DateStr , 8 , 2 )) = 1   -- 1931.1.13 1931/1/13 1931-1-13
                 set   @formatdate      =      substring ( @DateStr , 1 , 4 ) + ' -0 ' + substring ( @DateStr , 6 , 1 ) + ' - ' + substring ( @DateStr , 8 , 2 )
            
else
                
set   @formatdate = ''
        
end
          
else
            
set   @formatdate = ''
     
end

 
else   if   charindex ( ' ' , @DateStr ) > 0
     
set   @formatdate = substring ( @DateStr , 1 , 4 ) + ' -0 ' + substring ( @DateStr , 6 , 1 ) + ' -01 ' -- +substring(@DateStr,8,1)        
  else
    
set   @formatdate = ''

 
return   @formatdate
end
go
-- 对字符长度为9的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetNineChar(birth) where len(birth)=9



-- 字符串长度为10,建造函数
create   function  SetTenChar
-- 长度为10的格式
(
 
@DateStr   varchar ( 10 )
)
returns   varchar ( 10 )
as
begin
 
declare   @formatdate   varchar ( 10 )
 
if  dbo.CheckCharNum( ' . ' , @DateStr ) = 2   or  dbo.CheckCharNum( ' / ' , @DateStr ) = 2   -- 1931.12.09 1931.01.19 1931/12/09 1931/01/19
  begin
     
if  dbo.CheckIsNum( substring ( @DateStr , 1 , 4 )) = 1   and  dbo.CheckIsNum( substring ( @DateStr , 6 , 2 )) = 1   and  dbo.CheckIsNum( substring ( @DateStr , 9 , 2 )) = 1
        
set   @formatdate = substring ( @DateStr , 1 , 4 ) + ' - ' + substring ( @DateStr , 6 , 2 ) + ' - ' + substring ( @DateStr , 9 , 2 )
     
else
        
set   @formatdate = ''
 
end
 
else   if  dbo.CheckCharNum( ' - ' , @DateStr ) = 2
     
set   @formatdate = @DateStr
 
else
    
set   @formatdate = ''
 
return   @formatdate
end
go
-- 对字符长度为10的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetTenChar(birth) where len(birth)=10


-- 字符串长度大于10,建造函数
create   function  SetBigTenChar
-- 长度大于10的格式
(
 
@DateStr   varchar ( 30 )
)
returns   varchar ( 10 )
as
begin
     
declare   @formatdate   varchar ( 10 )
      
if   charindex ( ' ' , @DateStr ) > 0  
        
set   @formatdate =   substring ( @DateStr , 1 , 4 ) + ' - ' + substring ( @DateStr , 6 , 2 ) + ' - ' + substring ( @DateStr , 9 , 2 )
      
else
        
set   @formatdate = ''

    
return   @formatdate
end
go

-- 对字符长度大于10的日期进行格式化
--
update pi_CZRKDJB set birth=dbo.SetTenChar(birth) where len(birth)>10


执行的SQL:
-- 1999..2.2
update  pi_CZRKDJB  set  birth = replace (birth, ' .. ' , ' . ' where   charindex ( ' .. ' ,birth) > 0

-- 1999.2.2 0:0
update  pi_CZRKDJB  set  birth = replace (birth, '  0:0 ' , '' where   charindex ( '  0:0 ' ,birth) > 0


-- 字符长度为1
update  pi_CZRKDJB  set  birth = ''   where   len (birth) = 1

-- 对字符长度为2的日期进行格式化.
update  pi_CZRKDJB  set  birth = dbo.SetTwoChar(birth)  where   len (birth) = 2

-- 对字符长度为3的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetThreeChar(birth)  where   len (birth) = 3

-- 对字符长度为4的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetFourChar(birth)  where   len (birth) = 4

-- --对字符长度为5的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetFiveChar(birth)  where   len (birth) = 5

-- 对字符长度为6的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetSixChar(birth)  where   len (birth) = 6

-- 对字符长度为7的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetSevenChar(birth)  where   len (birth) = 7

-- 对字符长度为8的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetEightChar(birth)  where   len (birth) = 8

-- 对字符长度为9的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetNineChar(birth)  where   len (birth) = 9

-- 对字符长度为10的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetTenChar(birth)  where   len (birth) = 10

-- 对字符长度大于10的日期进行格式化
update  pi_CZRKDJB  set  birth = dbo.SetTenChar(birth)  where   len (birth) > 10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值