我有一个table , 某栏位是datetime类型
其他资料都好好的,但有一笔,内容是 0001-10-01 00:00:00.000直接对它 isdate ,居然结果是 1 
用convert(varchar,col)  ==>   Oct  1    1 12:00AM    (注意这里,如果col用 '0001-10-01'代替却是不行的)
  convert(varchar(20),col,120)  ==> 0001-10-01 00:00:00
反过来, convert(datetime,'Oct  1    1 12:00AM')  ==>  2001-10-01 00:00:00.000
什么原因???我是没搞懂,当初这笔资料是怎么insert进去的?我想手动insert,却怎么也不行。
但是系统自动却能每天都会这样的资料。
我靠

解决方案 »

  1.   

    Insert我是进不了,Isdate也是0,继续关注
      

  2.   

    是啊,直接isdate('0001-10-01') 是 0 哦
    可是在那个table里,用isdate(col) 就是 1 ,看起來col的值明明就是 0001-10-01 哦我用convert 转的结果在上面已经show出了。
    今天还只有1笔,昨天貌似有很多笔。
    奇怪的是系统咋就能自己insert进去的。
      

  3.   

    tony 用2008,是不是可以 有0001-01-01
      

  4.   


    不是,其他资料都正常
    一样。我新建一table,设datetime栏位,
    insert into #T
    select col from T 
    可以将这笔资料导进去,结果没啥变化
      

  5.   

    select isdate('0001-10-01 00:00:00.000')
    -----------
    0(1 行受影响)select @@version
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) 
    Oct 14 2005 00:33:37 
    Copyright (c) 1988-2005 Microsoft Corporation
    Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
    (1 行受影响)
      

  6.   

    我有一个table , 某栏位是datetime类型
    其他资料都好好的,但有一笔,内容是 0001-10-01 00:00:00.000直接对它 isdate ,居然结果是 1  
    >>datetime类型字段,isdate当然1用convert(varchar,col) ==> Oct 1 1 12:00AM (注意这里,如果col用 '0001-10-01'代替却是不行的)
    >>正常,convert(varchar,'0001-10-01')这里的'0001-10-01'本身是字符串,当然不必转换
      convert(varchar(20),col,120) ==> 0001-10-01 00:00:00
    >>很正常反过来, convert(datetime,'Oct 1 1 12:00AM') ==> 2001-10-01 00:00:00.000
    >>这里,'Oct 1 1 12:00AM'是短格式,只能定位到1970-2070(好像可以在控制面板设置) 
     
      

  7.   

    海兄,你分析了这么多,还是没说明为何datetime中能存入0001-10-01这样类似字符串的东东
      

  8.   

    .net日期的最小值是0001-01-01,是不是这个搞出来的
      

  9.   

    SQL Server 2000 吗?无图无真相
      

  10.   

    确实奇怪,后台跟踪一下看程序端是怎么录进来的。或者搞个触发器来跟踪是哪个时候搞进去的。如果并发数用户很多,排查就稍微困难了。
    DBCC 表 看能检查出什么问题不?哈哈
      

  11.   

    好像只有sql2008 的datetime2类型支持0001-01-01 到 9999-12-31
      

  12.   

    可能是.net没有手动给日期类型指定默认值,所以空值就是0001-10-01 00:00:00.000
    存数据库的时候,它之判断了数据类型都一样,就没有多做其它判断就直接存进去了(可能是都集成与CRL的原因吧)
    然后再从数据库读就不行了
    而在查询分析器里执行的时候就会做隐式转换。做数据类型判断,就会出错。这些纯属个人yy
      

  13.   

    没遇见过你的"two digit year cutoff"的配置是多少?
      

  14.   

    但是sql2000或者sql2005都会提示:不能将0001-10-01 00:00:00.000插入到数据库datetime类型
    大概是这样的错误的。
      

  15.   

    http://topic.csdn.net/u/20070817/15/6eeaff8b-50ce-45cc-8d6f-3a1d0802ff78.html?2016156401找到个跟你差不多的问题
      

  16.   

    server是SQL2000 
    无法解释为啥米会有 0001-10-01 这样的资料存在,也不知如何insert进去的。
    关键是,直接查询分析器insert不进去,
    而别的系统透过其它方式居然能insert进去(好像是透过java走的)
    难道sql server还能受贿开后门?Microsoft SQL Server  2000 - 8.00.2039 (Intel IA-64)   May  3 2005 23:34:52   Copyright (c) 1988-2003 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 
      

  17.   


    我的table里,null 还是 null....
    我去查查看源头,
    被搞蒙了
      

  18.   

    SQL 2000的东西,你能说得清吗 
      

  19.   

    这个恩  不知道 你不可以 把那个列 查出来了 然后凡是那样的数据 Replace 掉的吗
    只能够这样做了吧
      

  20.   

    我认为你看到的是0001-01-01,但是实际上不是.如同execl中某个字符串列(假设20位,全是数字,且第一位都是0),但实际上第一位显示的是0,你却查询不到他.
    我相信很多人用excel都遇到这个问题.也许和excel的原理一样.你对这个数据进行查询能查询到吗?例如:
    select * from tb where year(dt) <= 1
      

  21.   

    看看这个列值的二进制数据是什么。datetime 类型,第一个 4 字节存储 1900 年 1 月 1 日之前或之后的天数,后一个 4 字节存储以午夜后毫秒数所代表的每天的时间。手动转换一下是否是 2001-10-01 00:00:00.000
      

  22.   

    估计是mssql自动转换惹得祸
    一般情况下,是方便了开发者
    但是,出了问题,也难查了
      

  23.   

    你对这个数据进行查询能查询到吗?例如:
    select * from tb where year(dt) <= 1
    我相信你查询不到.所以我认为是显示(出错)的问题.
      

  24.   

    试了,08的DATE真的可以,晕,但DATETIME还是不行。
    declare @d datetime='0001-01-01 00:00:00.000'
    select @d
    /*消息 242,级别 16,状态 3,第 1 行
    从 varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。(1 行受影响)*/ 
    declare @d date='0001-01-01'
    select @d
    /*----------
    0001-01-01(1 行受影响)*/
      

  25.   


    报告乌龟大侠, 可以查到。
    而且更奇怪的是,
    同样的table里,如果只有1笔这样的数据,那reporting service还是可以跑出report
    但是这样的资料多一些,reporting service 就报错:Cannot read the next data row for the data set DataSet惭愧惭愧,目前我的做法是,
    update T
    set col= case when col<convert(datetime,'1999-01-01') then  convert(datetime,'1999-01-01')  
             else col end
      

  26.   

    我直接 select distinct year(col) from T
    得到结果:NULL
    1        -- 这笔NND不知道怎么出来的
    2005
    2008
    2009
    2010
    2011
    2012
      

  27.   


    这玩意不是偶然发生,
    好像透过其他系统的某些方式,是可以插入诸如 '0001-10-01'这样的在sql server认为非日期格式的东东到datetime栏位
      

  28.   

    年度为1的数据在SQL2000里也是越界的吧,是不是MS提供的JDK接口里的BUG
      

  29.   

    我有点不解,为什么2008 的DATE型可以录入 '0001-01-01'
      

  30.   

    不会吧不是说是1753-01-01 到 9999-12-31吗是不是被隐式转换成DATETIME2了
      

  31.   

    2008中date的范围就是0001-01-01 到 9999-12-31
      

  32.   

    更搞的来了
    我直接 select * from T where year(col)=1 如上,是可以查到数据的。然后加个opendatasource (就连的是本server)
    select * from 
    opendatasource('SQLOLEDB','data source=XXX;user id=sa;password=xxxx).DBName.dbo.T
    where year(col)=1
    会报错 :Error converting data type DBTYPE_DBTIMESTAMP to datetime.甚至上面的条件 where year(col)=1 不加,也报错
      

  33.   

    在SQL Server 2000 中,如果用:
    select cast('' as datetime) as dDate
    得到的结果是:1900-01-01 00:00:00.000