求助,现在有两个时间列,都是varchar(200)类型,我想得到两个日期想减的天数。
select DATEDIFF(DAY,CONVERT(varchar(200),时间1,120),CONVERT(varchar(200),时间2,120)) from table1但是总是提示错误提示转换失败和产生一个超出范围的值.
因为表中有些时间格式不标准,例如有2012-02-01,2012.02.01,2012—02—01之类的,但数量很少。这种问题怎么解决,小弟先行谢过了。

解决方案 »

  1.   

    如果你能确定你的类型及数量都是固定的,那么select 的时候用case when来有针对性地处理就可以了。并且你的这个表这样看来没有设计好和管控好,一般不应该存在不同类型的数据。可以加上约束来控制这种情况的再度发生。
      

  2.   

    就是这么回事,一开始没有定义成datetime类型,导致现在麻烦一堆,我也考虑了case when,先试试把。还有更好的解决办法吗
      

  3.   

    case when 也仅仅只能处理有限类型的,你可以考虑编写一个函数来处理你能预见的所有日期类型,把他们统一化。但是工作量也不会小
      

  4.   

    前期没有考虑到的问题,后期处理没有所谓的简单办法,要不就是把格式转换成统一的,要不就用case when判断处理
      

  5.   

    select 
    DATEDIFF(D,
    case 
    when substring(时间1,1,10) like '____-__-__' then convert(date,时间1,120)
    else '' end,
    case
    when substring(时间2,1,10) like '____-__-__' then convert(date,时间2,120)
    else '' end
    )
    from table1select 
    DATEDIFF(D,
    case 
    when substring(时间1,1,10) like '____-__-__' then cast(时间1 as datetime)
    else '' end,
    case
    when substring(时间2,1,10) like '____-__-__' then cast(时间2 as datetime)
    else '' end
    )
    from table1为什么都这样了,还是提示“从字符串转换日期和/或时间时,转换失败”
      

  6.   

    你这个case when处理能力有限,对其他类型的日期格式根本处理不了,比如20121003,你的就处理不了了
      

  7.   

    你也可以用is_date()函数来看看有多少数据是不可转换成日期型的。
      

  8.   

    就是这个,isdate(),解决了,谢大神。。