额,见了鬼了,有没有人碰到过这个问题??

playwarcraft 2010-05-19 08:55:58
我有一个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,却怎么也不行。
但是系统自动却能每天都会这样的资料。。。。
我靠
...全文
494 83 打赏 收藏 转发到动态 举报
写回复
用AI写文章
83 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixianxxx 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 guguda2008 的回复:]

引用 63 楼 htl258 的回复:

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

不会吧。。。不是说是1753-01-01 到 9999-12-31吗

是不是被隐式转换成DATETIME2了
[/Quote]
2000没有DATETIME2。。
feixianxxx 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 xman_78tom 的回复:]

看看这个列值的二进制数据是什么。

datetime 类型,第一个 4 字节存储 1900 年 1 月 1 日之前或之后的天数,后一个 4 字节存储以午夜后毫秒数所代表的每天的时间。

手动转换一下是否是 2001-10-01 00:00:00.000
[/Quote]
试试这个看。。
zhao89089 2010-05-19
  • 打赏
  • 举报
回复
帮顶!
guguda2008 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 69 楼 ldslove 的回复:]

引用 68 楼 playwarcraft 的回复:
引用 65 楼 dawugui 的回复:
如果真有这种情况,我建议你在程序中(是通过程序插入的吧?)改改,拒绝这样的数据进入数据库.


哎。。。。我不搞了,
只能如此,插入的时候,判断下。。。。。。


外部程序插入的时候不够严谨,网上我看了好多。都是因为前台软件的问题
[/Quote]

学习了,看来确实是MS的接口有问题
老黎 2010-05-19
  • 打赏
  • 举报
回复
GX沟沟兄中奖了
东那个升 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 68 楼 playwarcraft 的回复:]
引用 65 楼 dawugui 的回复:
如果真有这种情况,我建议你在程序中(是通过程序插入的吧?)改改,拒绝这样的数据进入数据库.


哎。。。。我不搞了,
只能如此,插入的时候,判断下。。。。。。
[/Quote]

外部程序插入的时候不够严谨,网上我看了好多。都是因为前台软件的问题
playwarcraft 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 65 楼 dawugui 的回复:]
如果真有这种情况,我建议你在程序中(是通过程序插入的吧?)改改,拒绝这样的数据进入数据库.
[/Quote]

哎。。。。我不搞了,
只能如此,插入的时候,判断下。。。。。。
playwarcraft 2010-05-19
  • 打赏
  • 举报
回复
更搞的来了。。。
我直接 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 不加,也报错。。。

。。。。。。。。。。。。

东那个升 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 htl258 的回复:]
我有点不解,为什么2008 的DATE型可以录入 '0001-01-01'
[/Quote]


2008中date的范围就是0001-01-01 到 9999-12-31
dawugui 2010-05-19
  • 打赏
  • 举报
回复
如果真有这种情况,我建议你在程序中(是通过程序插入的吧?)改改,拒绝这样的数据进入数据库.
guguda2008 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 htl258 的回复:]

我有点不解,为什么2008 的DATE型可以录入 '0001-01-01'
[/Quote]
不会吧。。。不是说是1753-01-01 到 9999-12-31吗

是不是被隐式转换成DATETIME2了
htl258_Tony 2010-05-19
  • 打赏
  • 举报
回复
我有点不解,为什么2008 的DATE型可以录入 '0001-01-01'
guguda2008 2010-05-19
  • 打赏
  • 举报
回复
把问题数据备个份传上来吧,让大家都欣赏一下
guguda2008 2010-05-19
  • 打赏
  • 举报
回复
检查所有对改列进行插入和修改的语句,确保赋值前变量为正确的日期格式。

或者对列加个约束,然后用平常的流程走一遍,看看哪里报错
guguda2008 2010-05-19
  • 打赏
  • 举报
回复
年度为1的数据在SQL2000里也是越界的吧,是不是MS提供的JDK接口里的BUG
samyou 2010-05-19
  • 打赏
  • 举报
回复
数据库是什么版本呢?
日期的显示跟操作系统的设置方式是有关系的。
playwarcraft 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 htl258 的回复:]
引用 54 楼 playwarcraft 的回复:
我直接 select distinct year(col) from T
得到结果:

SQL code

NULL
1 -- 这笔NND不知道怎么出来的。。。
2005
2008

相信系统有鬼,上月末我也遇到一个解释不清的问题。
[/Quote]

这玩意不是偶然发生,
好像透过其他系统的某些方式,是可以插入诸如 '0001-10-01'这样的在sql server认为非日期格式的东东到datetime栏位。。。
htl258_Tony 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 playwarcraft 的回复:]
我直接 select distinct year(col) from T
得到结果:

SQL code

NULL
1 -- 这笔NND不知道怎么出来的。。。
2005
2008
2009
2010
2011
2012
[/Quote]
相信系统有鬼,上月末我也遇到一个解释不清的问题。
东那个升 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 playwarcraft 的回复:]
我直接 select distinct year(col) from T
得到结果:

SQL code

NULL
1 -- 这笔NND不知道怎么出来的。。。
2005
2008
2009
2010
2011
2012
[/Quote]

playwarcraft 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 haiwer 的回复:]
还没结论?
[/Quote]

海爷~~~
加载更多回复(62)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧