神了,难道是SQL的bug?

GoldShield 2010-10-15 02:10:42
数据库中的一张表t, t(tickno char(10),class_date datetime), 现在连续的几行记录如:
1,2010-10-13 00:00:00.000
2,2010-10-13 00:00:00.000
3,2010-10-13 00:00:00.000
4,2010-10-13 00:00:00.000
5,2010-10-13 00:00:00.000

现在的问题是1,4,5可以通过时间查询出来,但中间两条通过时间就是查不出来
select * from t where class_date='2010-10-13 00:00:00.000'
这条语句只查的出前后的,中间的就是查不出来。为何呢?
即使用
select * from t where class_date between '2010-10-12 00:00:01.000' and '2010-10-14 23:59:59.000'
这条也查询不出来,搞不懂了,难道是bug? 用datepart分别取各值出来的解是2010-10-13!

...全文
328 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
GoldShield 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 jinjazz 的回复:]
lz看的眼熟,差不多五六年没见了吧,嘿嘿
[/Quote]


看着你的近身剪,一样的熟悉哈。
jinjazz 2010-10-18
  • 打赏
  • 举报
回复
你数据库服务器上windows日前格式设置是什么呢
jinjazz 2010-10-18
  • 打赏
  • 举报
回复
lz看的眼熟,差不多五六年没见了吧,嘿嘿
GoldShield 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 beirut 的回复:]
引用 29 楼 goldshield 的回复:
真实数据是varchar(10),并且里边对其它记录都可以正确的检索出来的,400w+的记录里边就几十条检索不出来

你的class_date 是char(10)???
如果是这样的话,你在开个贴给我100
[/Quote]

哥们,classDate肯定不是varchar类型的
louisit 2010-10-18
  • 打赏
  • 举报
回复
顶顶!
abuying 2010-10-18
  • 打赏
  • 举报
回复
可能是字符的编码或者格式有问题,
如全角与半角,ansii与unicode区别。
或者前面,后面含 有 tab,空格,等。
ascii()
declare @i int 
set @i=1
declare @s varchar(20)
select @s=select top 1 convert(varchar(20),'2010-10-1') from tb where TickNO=2
while @i<20
begin
select ascii(substring(@s,@i,1)) from tb where TickNO=2
set @i=@i+1

end
SQL77 2010-10-16
  • 打赏
  • 举报
回复
...
claro 2010-10-16
  • 打赏
  • 举报
回复
呵呵。
黄_瓜 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 goldshield 的回复:]
真实数据是varchar(10),并且里边对其它记录都可以正确的检索出来的,400w+的记录里边就几十条检索不出来
[/Quote]
你的class_date 是char(10)???
如果是这样的话,你在开个贴给我100

yuhuiwqvb 2010-10-15
  • 打赏
  • 举报
回复
我以前好像也遇到过这样的问题,后来也是同学让我用datediff解决的,个中原因我也没搞懂。。
lovezx1028 2010-10-15
  • 打赏
  • 举报
回复
select @@version

select * from tb where [date]='2010-10-13 00:00:00.000'

select * from tb where [date]='2010-10-13'
lovezx1028 2010-10-15
  • 打赏
  • 举报
回复
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) 
Oct 14 2005 00:33:37
Copyright (c) 1988-2005 Microsoft Corporation
Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)


(1 行受影响)

id date
----------- -----------------------
1 2010-10-13 00:00:00.000
2 2010-10-13 00:00:00.000
3 2010-10-13 00:00:00.000
4 2010-10-13 00:00:00.000
5 2010-10-13 00:00:00.000

(5 行受影响)

id date
----------- -----------------------
1 2010-10-13 00:00:00.000
2 2010-10-13 00:00:00.000
3 2010-10-13 00:00:00.000
4 2010-10-13 00:00:00.000
5 2010-10-13 00:00:00.000

(5 行受影响)
没有问题。。
ok1411 2010-10-15
  • 打赏
  • 举报
回复
不懂,学习了
ltysunde 2010-10-15
  • 打赏
  • 举报
回复
帮顶下。。给5分行不?
dawugui 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 goldshield 的回复:]
你说字符集不对,但其它的又可以啊。记录都是连续的,前台的数据采集来自同一台机器,中间又没做任何其它操作,重启电脑或者什么的,能查出来的和后面不能查出来的也就相差几秒而已
[/Quote]
那就不清楚了,既然有种方法能行,就先用着吧.帮顶了.
a277467307 2010-10-15
  • 打赏
  • 举报
回复
你只查这个(2010-10-13)看看,系统会不会把后面的0忽略了。
GoldShield 2010-10-15
  • 打赏
  • 举报
回复
你说字符集不对,但其它的又可以啊。记录都是连续的,前台的数据采集来自同一台机器,中间又没做任何其它操作,重启电脑或者什么的,能查出来的和后面不能查出来的也就相差几秒而已
GoldShield 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 dawugui 的回复:]
引用 32 楼 goldshield 的回复:
前两种一样的查询不出来,后一种可以查询出,点解?

你的字符也许存在问题,例如不是标准的ANSI编码.
你可以尝试把所有的date导出来到文本中检查一下.

或者:
select * from tb where date = N'2010-10-13 00:00:00.000'

select * from tb where con……
[/Quote]

结果一样,还是只有采用datediff的可以查询出来
dawugui 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 goldshield 的回复:]
前两种一样的查询不出来,后一种可以查询出,点解?[/Quote]

你的字符也许存在问题,例如不是标准的ANSI编码.
你可以尝试把所有的date导出来到文本中检查一下.

或者:
select * from tb where date = N'2010-10-13 00:00:00.000'

select * from tb where convert(varchar(10),date,120) = N'2010-10-13'

select * from tb where datediff(day,date, N'2010-10-13') = 0
GoldShield 2010-10-15
  • 打赏
  • 举报
回复

select * from tb where date = '2010-10-13 00:00:00.000'

select * from tb where convert(varchar(10),date,120) = '2010-10-13'

select * from tb where datediff(day,date, '2010-10-13') = 0

前两种一样的查询不出来,后一种可以查询出,点解?
加载更多回复(30)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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