执行如下操作:
select * from Tab where datime>'2010-01-01'发生如下错误:
在执行批处理时出现错误。错误消息为: SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。请教:
这是什么原因?
我该如何找出有问题的数据,把这些数据删除?

解决方案 »

  1.   

    select * from Tab where datime > cast('2010-01-01' as datetime)
      

  2.   

    EXEC sp_helplanguage @@LANGUAGE
    看dateformat是什么?select * from Tab where datime>'20100101'
    这样试试看。
      

  3.   

    dateformat=ymd也不行,我怀疑里边有数据溢出。但不知道怎么找出这部分数据
      

  4.   

    要是这样的话:
    select * from Tab where datime>'1/1/2010'
    它咋说?
      

  5.   


    看一下Tab的定义。这是表还是视图?
    如果是表,有没有计算性列?
    datime是什么类型?
      

  6.   

    原因 :参考看看 http://blog.csdn.net/OrchidCat/archive/2010/06/25/5694139.aspx
      

  7.   

    DBCC CheckTable ('Tab')我这样检查的结果是:
    列 "ImportTime" 的值超出了数据类型"datetime"的范围。请将该列更新为合法的值。
    发现 0 个分配错误和 4408 个一致性错误
      

  8.   

    datime between '2010-01-01' and max(datetime)吧,这问题纠结的
      

  9.   


    declare @table table (pc_name varchar(3),date varchar(20))
    insert into @table
    select 'pc1','2010-10-09' union all
    select 'pc2','10000-09-22' union all
    select 'pc3','2010-02-90' union all
    select 'pc4','2010-01-01' union all
    select 'pc5','2010-01-02' union all
    select 'pc6','2010-22-11' union all
    select 'pc7','2010-11-11' union all
    select 'pc8','2010-11-12'
    select * from @table where isdate(date)=0/*
    pc_name date
    ------- --------------------
    pc2     10000-09-22
    pc3     2010-02-90
    pc6     2010-22-11
    */
      

  10.   


    --16# 可以找到不合理的时间数据--删除非法时间数据delete from 表名 where isdate(时间字段)=0
      

  11.   

    select * from tb order by datime然后看哪个数据有问题?
      

  12.   

    消息 542,级别 16,状态 1,第 1 行
    遇到了无效的 datetime 值。该值超过了 9999 年。
      

  13.   

    alter table tab alter column datime varchar(20)再查.
      

  14.   

    消息 542,级别 16,状态 1,第 1 行
    遇到了无效的 datetime 值。该值超过了 9999 年。
    语句已终止。
      

  15.   


    这都能行,数据是咋进去的? 比较纳闷了那就找出isdate()=1的数据,然后做个表;然后联合一下,就可以得到无效的数据了。 
    再看看怎么处理合适!
      

  16.   

    isdate()=1 也会出错,NND消息 542,级别 16,状态 1,第 1 行
    遇到了无效的 datetime 值。该值超过了 9999 年。
      

  17.   

    select count(*) from Tab where datime between '1900-01-01' and '2100-0101'
    select count(*) from Tab
    比较一下有多少记录出错了.
    如果能比较,如果出错的记录不多,那:
    select * into # from Tab where datime between '1900-01-01' and '2100-0101'
    drop table tab
    select * into tab from #
      

  18.   

    那还等什么,赶紧复制出去.
    select * into # from Tab where datime between '1900-01-01' and '2100-0101'
      

  19.   

    不是我吓唬你,你的机器硬件恐怕有问题了,DBMS是不会让这样的错误进入数据库的.
      

  20.   

    既然
    select * into # from Tab where datime between '1900-01-01' and '2100-0101'
    能做,那不会:
    select * from Tab where datime between '2010-01-01' and '2100-0101'
    所要的结果不就和楼主的一样了?
      

  21.   

    select * from Tab
    /*
    Col1        COl2
    ----------- -----
    1           a,b,c
    2           d,e
    3           f(3 行受影响)*/
    select 'insert into tb select ',Col1,',''',Col2,''' union all' from Tab
    /*
                           Col1             Col2  
    ---------------------- ----------- ---- ----- -----------
    insert into tb select  1           ,'   a,b,c ' union all
    insert into tb select  2           ,'   d,e   ' union all
    insert into tb select  3           ,'   f     ' union all(3 行受影响)
    */
    --把上面的长空格替换掉,直接复制后执行,把数据插入到 tb 表中.
      

  22.   


    貌似是这个列的问题。但是很好奇这个不合法的值是怎么进到表里的。能不能把这个表的数据bcp出来?
      

  23.   

    bcp 也不方便,数据量太大,如果全出来的话,文本都打不开了。如果加条件就会出错
      

  24.   

    发现个新情况。我这张表的ID字段是自增长,但是ID居然有重复了。
      

  25.   

    建议:
    1.把数据库备份到其他机器上,试试是不是还有问题.
    2.把数据库作备份,卸载重装MSSQL,再恢复了试试.
    3.如果硬盘肯定没问题,那把主板/内存/CPU之类的换换,如果不这样做,类似的问题可能还会在其他表中陆续出现.
      

  26.   

    必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间,以這一句來看,你是不是可以寫成
    select * from Tab where datime>'1/1/2010'試試看
      

  27.   


    怎么进去的估计楼主也不知道,有多少条好像是用查询的查不出来,等待办法!
    难道打开表一条一条看?哎!纠结ing...
      

  28.   


    EXEC sp_spaceused 'tablename'查看表中有多少记录。
      

  29.   

    最后的解决方法:
    用ALTER TABLE  SWITCH PARTITION移出分区,相当于把新分区的数据都删了。
    最后重新导入数据。没办法的办法。