在SQL查詢中,有兩個字段RQ和XCRQ,一個是varchar,長度是20;另一個是smalldatetime,長度是4。要求這兩個字段相差大於14個月的值,用datediff總是提示轉換出錯,怎麼辦?

解决方案 »

  1.   

    DATEDIFF ( datepart , startdate , enddate )
      

  2.   

    有非日期吧
    过滤下
    and isdate(rq)=1
      

  3.   

    DATEDIFF(month, cast(RQ as date), cast(XCRQ  as  date))
      

  4.   

    declare @RQ varchar(20)  = '2010-08-01 17:50:50'
    declare @XCRQ smalldatetime  = getdate()select * from tb  where DATEDIFF(m,@RQ,@XCRQ)>14
      

  5.   

    declare @RQ varchar(20)  = '2010-08-01 17:50:50'
    declare @XCRQ smalldatetime  = getdate()select * from tb  where DATEDIFF(m,@RQ,@XCRQ)>14
      

  6.   

    declare @RQ varchar(20)  = '2010-08-01 17:50:50'
    declare @XCRQ smalldatetime  = getdate()select   DATEDIFF(m,@RQ,@XCRQ) 
      

  7.   

    RQ  字段是varchar的,但是其数值输入的格式基本上都是YYYY-YY-YY的
    用and isdate(rq)=1 过滤前后数值一样我的命令是SELECT *
    FROM T_SBxx_JYXX_nbtjzx
    WHERE (DATEDIFF(m,XCRQ,RQ)>14) 我查了,两个字段中都没有空值
      

  8.   

    SELECT * 
    FROM (
             SELECT * 
             FROM T_SBxx_JYXX_nbtjzx
             WHERE ISDATE(rq) = 1
         ) t
    WHERE (DATEDIFF(m, XCRQ, RQ)>14)  这样呢?
      

  9.   

    SELECT * 
    FROM (
             SELECT * 
             FROM T_SBxx_JYXX_nbtjzx
             WHERE ISDATE(rq) = 1
         ) t
    WHERE (DATEDIFF(m, XCRQ, RQ)>14)  这样呢?
      

  10.   

    select *
    from  T_SBxx_JYXX_nbtjzx
    where isdate(rq)=0
    --看看有没有数据
      

  11.   

    @xuam:
    直接用CAST轉換和不用CAST是一樣的,都顯示轉換出錯
      

  12.   

    @wufeng4552:
    查了,兩個字段都查了,沒有值
      

  13.   

    @htl258 您之前的方法用了,還是顯示轉換datetime時出錯
      

  14.   

    有沒有什麽方法可以將VARCHAR轉換成datetime的?
      

  15.   


    如果可以转换成日期型的,不用转默认会向DATETIME类型转换,楼主转换出错是什么错,发出来
      

  16.   

    服务器: 消息 241,级别 16,状态 1,行 1
    从字符串转换为 datetime 时发生语法错误。
      

  17.   

    命令改成這樣了select *
    from (select * from t_sbxx_jyxx_nbtjzx where isdate(XCRQ)=1 and isdate(RQ)=1)T
    where (datediff(mm,XCRQ,RQ)>14)
      

  18.   

    这很明显,你的那个字符型的,有一些肯定不能转成时间型select *
    from  T_SBxx_JYXX_nbtjzx
    where isdate(rq)=0ISDATE
    确定输入表达式是否为有效的日期。语法
    ISDATE ( expression ) 参数
    expression一个表达式,将要验证它是否为一个日期。expression 是任何返回 varchar 数据类型的表达式。 返回类型
    int注释
    如果输入表达式是有效的日期,那么 ISDATE 返回 1;否则,返回 0。下表显示一组示例所得到的返回值。列值 (varchar) ISDATE 返回值 
    NULL 0 
    Abc 0 
    100、-100、100 a 或 100.00 0 
    .01 0 
    -100.1234e-123 0 
    .231e90 0 
    $100.12345、- $100.12345 或 $-1000.123 0 
    as100 或 1a00 0 
    1995-10-1、1/20/95、1995-10-1 12:00pm、Feb 7 1995 11:00pm、1995-10-1 或者 1/23/95 1 
    13/43/3425 或 1995-10-1a 0 
    $1000、$100 或 $100 a 0 
      

  19.   

    表結構上,開頭說了RQ是varchar,長度是20;XCRQ是smalldatetime,長度是4。會不會這個有影響?
      

  20.   

    看看是哪一行数据报错:SELECT *, DATEDIFF(m,XCRQ,RQ)
    FROM T_SBxx_JYXX_nbtjzx
      

  21.   

    @feilniu
    第一行就出錯了服务器: 消息 241,级别 16,状态 1,行 1
    从字符串转换为 datetime 时发生语法错误。
      

  22.   

    數據有兩萬多條啊,用isdate(RQ)=1限制后,還會有什麽樣情況可能導致轉換出錯?
      

  23.   

    問題已經解決,謝謝SQL77:)最終命令為select * from  T_SBXX_JYXX_NBTJZX where datediff(mm,case when isdate(RQ)=0 then XCRQ else RQ END ,XCRQ)>14