在一个表里,有个身份证字段,出生年月字段, 我现在通过前一个字段提取后一个字段所需的数据,前面是字符型,后面是日期型,我在更新的时候加上了‘ -’作为年月日的连接,如:340403195503031434 更新另一字段为1955-03-03
结果出现:从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。
  感觉程序写的对的啊,是怎么回事啊update a set A0111 = 
  case Len(Rtrim(A0177) )
    when 15 then '19' + SubString(A0177,7,2) + '-' + SubString(A0177,9,2) + '-' + SubString(A0177,11,2)
    when 18 then SubString(A0177,7,4) + '-' + SubString(A0177,11,2) + '-' + SubString(A0177,13,2)  
    else A0111
  enda0111日期型,a0177字符型 另一个写法也不行
update A01 set A0111 = 
  case 
    when len(ltrim(a0177))=15 then cast('19'+ SubString(A0177,7,6) as datetime)
    when len(ltrim(a0177))=18 then cast(SubString(A0177,7,8) as datetime)
    else 0 
  end

解决方案 »

  1.   

    看看a0177的数据中有没有非法数据导致datetime 值越界
      

  2.   

    declare @s as varchar(20)
    set @s = '340403195503031434'select cast(substring(@s,7,4) + '-' + substring(@s,11,2) + '-' + substring(@s,13,2) as datetime) as birthday/*
    birthday                                               
    ------------------------------------------------------ 
    1955-03-03 00:00:00.000(所影响的行数为 1 行)
    */
      

  3.   

    ISDATE
    确定输入表达式是否为有效的日期。
    返回类型
    int注释
    如果输入表达式是有效的日期,那么 ISDATE 返回 1;否则,返回 0。select ..... from tb where isdate(substring(dt,7,4) + '-' + substring(dt,11,2) + '-' + substring(dt,13,2)) = 1