从未见如此奇怪的问题: 数据库查询方面(极简单) (20分)

  • 主题发起人 主题发起人 lixx
  • 开始时间 开始时间
L

lixx

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一Access数据库中的表table1,是如下结构
Datetime:是日期/时间型
Ua :是数字型
-----------------------+-----------+
DateTime | Ua |
-----------------------+-----------+
2001-11-01 00:00:00 | 123 |
-----------------------+-----------+
2001-11-01 01:00:00 | 123 |
-----------------------+-----------+
2001-11-01 02:00:00 | 123 |
-----------------------+-----------+
2001-11-01 03:00:00 | 123 |
-----------------------+-----------+
... ... | ... |
-----------------------+-----------+
2001-11-01 23:00:00 | 123 |
-----------------------+-----------+
现在我想查询某个时间的值,采用如下语句:
With Query1 do
begin
Close;
SQL.Add('select * from table1 where timevalue(datetime)=:MyTime');
Parambyname('MyTime').AsDatetime:=strtoTime('00:00:00');
Open;
end;
问题是:
当参数MyTime是
05:00:00 07:00:00 10:00:00 14:00:00 17:00:00 20:00:00 23:00:00
时,查询不出来(数据库明明有)
但当MyTime是其它值时,比如
00:00:00 01:00:00 02:00:00 11:00:00等
(反正24小时制中除了上面所说的7个外,其余都一切正常)
(我百思不得其解,这个简单之极的问题搞的我快崩溃了)
[不要怀疑我的Datetime字段有误,我检查了几十遍这24条记录!]
请各位帮忙!
我用的是Delphi6+Access
分太少还请大家见谅!我是个新手分不多的。

 
你用LIKE試試看。用等于本來就只能得到精度為秒的數據。不過你本身就是秒﹐我也搞不清
楚。
 
Try AsTime not AsDateTime?

 
各位,别光看不说,是不是不相信?
我也不相信,可事实就是这样,我也没办法...
如果你有D6 + Access(97)你以试一下, 没有必要输入24条记录,只要输入上面
的七条记录中的一条即可,你可以试着查一下... ...
 
不能用AsTime,因为Datetime是"日期/时间型"
SQL语句会出错。

To All:快救人呐...
 
将Parambyname('MyTime').AsDatetime改为Parambyname('MyTime').value
 
改成Value也没用
 
输入一个范围值
SQL.Add('select * from table1 where timevalue(datetime)>:MyTime and timevalue(datetime)<:Mytime1');
Parambyname('MyTime').AsDatetime:=strtoTime('00:00:00');

Parambyname('MyTime').AsDatetime:=strtoTime('00:30:00');

 
我的解决方法如ugvanxk所说是输入了一个范围值,比如要查询 05:00:00 只好输入
》=05:00:00 《=05:00:01
(因为查询05:00:00时,输入=05:00:00时,不行但输入》05:00:00却可以显示出来)
这样做使用整个查询效率下降了许多,我的查询要花1分钟才能出来,不知用户能不能受得了。
To All
各位没有好办法了吗?
我不知道时间在Delphi中是用什么表示的,如果不是用浮点数表示的话不会出现这个问题。
但如果是用浮点表示的,出现这种情况却是很正常的(一般来讲浮点数是不宜进行直接相等比较的)
出现这种情况我估计在Delphi中日期/时间型数据是用浮点表示的
(整数部分表示日期,小数部分表示时间???))
 
Delphi 中的TDateTime是一个Double型,表示的是从“1899/12/30”到现在的时间差,
整数部份表示天数,小数部份表示一天24小时的分数,比如0.25(1/4)表示早上6:00。
Delphi帮助文件中有讲。

另外SQL语句是在服务端执行的,可以用SQLMon.exe观察一下,问题是出在服务端还是
客户端,换句话说,看看Delphi送出的SQL语句精度是否正确。
 
select ua, convert(char(8),datetime1,14) from test where convert(char(8),datetime,14)='01:00:00'
sql2000通过。
 
试试:
select * from table1 where datepart(hh,datetime)='00'
and datepart(mi,datetime)='00'
and datepart(ss,datetime)='00'

将时分秒分开处理
至于你的问题,应该是因为datetime类型它的秒是不准确储存的原因吧
 
多人接受答案了。
 
后退
顶部