如何根据时间类型字段搜索数据??(100分)

  • 主题发起人 Peter.pan
  • 开始时间
P

Peter.pan

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi+ms sql server2000.在界面上放了两个DateTimePicker,有一table1,其中一个
字段为date1,现在要找出所有符合(date1>=DateTimePicker1.date) and
(date1<=DateTimePicker2.date)的纪录。
用adoquery查询:
adoquery1.close;
adoquery1.sql.text:='select * from table1 where (date1>=DateTimePicker1.date) and
(date1<=DateTimePicker2.date)';
adoquery1.open;
出现的问题:
当DateTimePicker1.date=DateTimePicker2.date时,库里有记录,但就是搜索不出来,请教各位
 
在主窗体的CREATE加入
ShortDateFormat:='yyyy-mm-dd';
试试看
 
adoquery1.sql.text:='select * from table1 where (date1>=DateTimePicker1.date) and
(date1<=DateTimePicker2.date)';
肯定存在问题呀。
使用Convert将DateTimePicker1.date转换成日期。
注意,是SQL语句中的日期。
 
adoquery1.sql.text:='select * from table1 where (date1>=DateTimePicker1.date) and
(date1<=DateTimePicker2.date)';
改为
adoquery1.sql.text:='select * from table1 where (date1>='+''''+DATETIMETOSTR(ateTimePicker1.date)+''''+ 'and
date1<='+''''+DATETIMETOSTR(DateTimePicker2.date)+'''';
因为你所写的不是DATE1=时间而是DATE='DateTimePicker2.date'字符串
 
你不要用这个,用adodataset里的一个event,onFilterRecord,在里面写代码:
procedure adodataset.FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
if adodatasetDate1.value <= datetimepick2.date then
accept:=true
else
accept:=false;
end;

此处仅仅为了示意,不一定能跑。上用到的adodatasetdate1是adodataset自动建立的对象,
指向data1字段。

然后打开adodataset.filtered:=true
她会先执行过滤adodataset.filter的内容。
 
楼上的方法是过滤,如果是单机数据库系统就可以用
如果时网络系统是为了不影响速度,所以没有再入服务器端的
载入所有数据,你过滤的可能就会发生缺少记录的问题啦
 
上面我说的问题是为了减少客户端和服务之间的数据流量
我有一段就是关于按照时间活的数据的代码(用过滤和下载数据的结合使用):
procedure Tfcom.dpsChange(Sender: TObject);
var dts,dte:string;
rx:byte;
begin

if ((sender as tdatetimepicker).name='dps') then
begin
if dps.Date>dpz.date then
dps.Date:=dpz.date;
end;

if ((sender as tdatetimepicker).name='dpz') then
begin
if dpz.Date<dps.Date then
dpz.Date:=dps.date;
end;
if dps.Date=dpz.Date then
begin

if (((sender as Tdatetimepicker).name='tpz') or(((sender as tdatetimepicker).name='dpz')) ) and (tpz.Time<tps.Time) then
begin
tpz.time:=tps.time;
end;

if (((sender as Tdatetimepicker).name='tps') or ( ((sender as tdatetimepicker).name='dps'))) and (tps.time>tpz.Time) then
tps.Time:=tpz.time;


end;
 
是不是应该设置 datetimepicker1.date 的 time 00:00:01
datetimepicker2.date 的 time 23:59:59
在组件上设置一下试试
 
to yzhshi:DateTimePicker1.date本身就是日期类型的嘛
to yangyugw:考虑到个台机器时间格式的不同,还是不要转化为string类型
Crosman的方法我试试看
 
还有没有更好的方法??
 
peter.pan
我的
ShortDateFormat:='yyyy-mm-dd';
已经让你的程序在任何计算机上运行都是这种时间类型,我一直用这种方法一点问题都没有
如果不加入这句话,我论你用谁的方法都会有问题,因为有些计算机是'yy-mm-dd'的时间
格式那无论是我的方法,还是过滤方法都会出现错误的。

 
to yangyugw:你的方法的确是可以,但是我觉得,日期类型是双精度类型(double),如果
能够用双精度数据类型来比较,是否好一些??
 
我的作法是全换成string类型,用datetostr,strtodate转换.
 
adoquery1.close;
adoquery1.sql.text:='select * from table1 where (date1>=:min) and
(date1<=:max)';
parambyname('min').asdatetime:=trunc(DateTimePicker1.datetime);
parambyname('max').asdatetime:=trunc(DateTimePicker2.datetime);

adoquery1.open;
 
顶部