我用ado+access+delphi6.0开发一个小程序,日期型字段太困惑人了,了解的来看看!(50分)

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

libaoliang

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ado+access+delphi6.0开发一个小程序,
其中数据表中有一日期字段,在数据输入时
日期使用的是datetimepicker控件,
在access数据表中字段类型是日期/时间型,
当然对日期字段也只有这种类型,
问题是我在输入数据后浏览时发现总是有日期和时间,
而且时间也不是数据输入时的当时时间,请问如何只要
日期而不要时间,
在用adoquery控件统计数据时,使用了有关时间的动态
参数,但怎么设置都不对,请问这是为什么?

procedure Ttj.BitBtn1Click(Sender: TObject);
var s1:string;
begin
adoquery1.Close;
adoquery1.sql.clear;
s1:='select gd as 工段,xm as 违纪人,tl as 违纪内容,sum(je) as 罚款金额 from khjl where (rq between :rq1 and :rq2) group by gd,xm,tl';
adoquery1.sql.add(s1);
adoquery1.Prepared:=True;
adoquery1.parameters[0].value:=datetimepicker1.date;
adoquery1.parameters[1].value:=datetimepicker2.date;
adoquery1.open;
end;
错误信息是:标准表达式中数据类型不匹配

把其中的
adoquery1.parameters[0].value:=datetimepicker1.date;
adoquery1.parameters[1].value:=datetimepicker2.date;
改为:
adoquery1.parambyname('rq1').asdate:=datetimepicker1.date;
adoquery1.parambyname('rq2').asdate:=datetimepicker2.date;
也不对,困惑死了!

 
那你把日期和时间转换成字符串,再截取日期部分后转换回来。
 
你将日期字段添加一个默认值 now()即刻 以后不用再输入日期了!系统会自动帮你输入日期的!
在查询mdb数据库查询日期时 要加入#如
'select * from 表 where 日期=#2002-1-1#';
即可
 
ADOQuery1.Parameters.ParamByName('rq1').value:=date();
 
上述两种办法都不妥,
在输入时是可能更改日期的,
所以不能由系统输入,
在统计时需要根据用户选择的日期范围进行统计,
请大家再考虑一下上述代码为何不对!
 
试试这样
adoquery1.parameters[0].asstring:='#'+datetostr(datetimepicker1.date)+'#';
adoquery1.parameters[1].asstring:='#'+datetostr(datetimepicker1.date)+'#';
 
procedure Ttj.BitBtn1Click(Sender: TObject);
var s1:string;
begin
adoquery1.Close;
adoquery1.sql.clear;
s1:='select gd as 工段,xm as 违纪人,tl as 违纪内容,sum(je) as 罚款金额 from khjl where (str(rq) between :rq1 and :rq2) group by gd,xm,tl';
adoquery1.sql.add(s1);
adoquery1.Prepared:=True;
adoquery1.parameters[0].value:=datetostr(datetimepicker1.date);
adoquery1.parameters[1].value:=datetostr(datetimepicker2.date);
adoquery1.open;
end;
 
迷糊的用法应该是可行的。
但是建议楼主在对日期型字段进行操作的时候,还是保持警惕。最好的也是一劳永逸的办法是对于传入参数使用字符串,再SQL语句里再用转换函数将日期型字段转换成对应格式的字符串,对字符串进行比较。
 
在ACCESS里,主要是要在日期字符串的两头加上'#',正如hstod和迷糊二位的例子。
 
先设datetimepicker1.kind:=dtkDate
datetimepicker2.kind:=dtkDate
然后改为:
adoquery1.parambyname('rq1').asdatetime:=datetimepicker1.datetime;
adoquery1.parambyname('rq2').asdatetime:=datetimepicker2.datetime;
 
最好不要用参数,直接使用SQL语句就行了!
procedure Ttj.BitBtn1Click(Sender: TObject);
var
s1:string;
StartDate,EndDate:string;
begin
StartDate:=DateTimeToStr(datetimepicker1.date);
EndDate:=DateTimetoStr(datetimepicker2.date);
adoquery1.Close;
adoquery1.sql.clear;
s1:='select gd as 工段,xm as 违纪人,tl as 违纪内容,sum(je) as 罚款金额 from khjl where (rq between '''+StartDate+''' and '''+EndDate+''') group by gd,xm,tl';
adoquery1.sql.add(s1);
adoquery1.Prepared:=True;
adoquery1.open;
end;
 
保存日期自断时不要保存时间
用formatdatetime('yyyy-mm-dd',now);
 
迷糊的方法我在 oracle中用过可以
 
多谢各位热心帮助,我试试看!
 
上述方法我都试过,还是不行,
提示“标准表达式中数据类型错”
我使用的是delphi6.0+ado+access+adoqyery,
ado不支持as参数,
请各位考虑究竟是什么原因,
看私简单的问题为什么就是不行,
并不违反语法或逻辑啊!
 
难道跟数据库的日期字段类型或什么有关系吗?
 
设置时间的显示格式,然后时间字段加上 # #同 hstod 所写!
 
nadoto的是可以的,其他方式都不行
谢谢各位参与!
 
后退
顶部