我有一个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,却怎么也不行。
但是系统自动却能每天都会这样的资料。
我靠
其他资料都好好的,但有一笔,内容是 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,却怎么也不行。
但是系统自动却能每天都会这样的资料。
我靠
可是在那个table里,用isdate(col) 就是 1 ,看起來col的值明明就是 0001-10-01 哦我用convert 转的结果在上面已经show出了。
今天还只有1笔,昨天貌似有很多笔。
奇怪的是系统咋就能自己insert进去的。
不是,其他资料都正常
一样。我新建一table,设datetime栏位,
insert into #T
select col from T
可以将这笔资料导进去,结果没啥变化
-----------
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 行受影响)
其他资料都好好的,但有一笔,内容是 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(好像可以在控制面板设置)
DBCC 表 看能检查出什么问题不?哈哈
存数据库的时候,它之判断了数据类型都一样,就没有多做其它判断就直接存进去了(可能是都集成与CRL的原因吧)
然后再从数据库读就不行了
而在查询分析器里执行的时候就会做隐式转换。做数据类型判断,就会出错。这些纯属个人yy
大概是这样的错误的。
无法解释为啥米会有 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)
我的table里,null 还是 null....
我去查查看源头,
被搞蒙了
只能够这样做了吧
我相信很多人用excel都遇到这个问题.也许和excel的原理一样.你对这个数据进行查询能查询到吗?例如:
select * from tb where year(dt) <= 1
一般情况下,是方便了开发者
但是,出了问题,也难查了
select * from tb where year(dt) <= 1
我相信你查询不到.所以我认为是显示(出错)的问题.
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 行受影响)*/
报告乌龟大侠, 可以查到。
而且更奇怪的是,
同样的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
得到结果:NULL
1 -- 这笔NND不知道怎么出来的
2005
2008
2009
2010
2011
2012
这玩意不是偶然发生,
好像透过其他系统的某些方式,是可以插入诸如 '0001-10-01'这样的在sql server认为非日期格式的东东到datetime栏位
我直接 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 不加,也报错
select cast('' as datetime) as dDate
得到的结果是:1900-01-01 00:00:00.000