法1:通过Format来格式化SQL,Access中yyyy-MM-dd 型日期与其它条件混合查询,写好SQL语句的格式很重要。
//日期与其它信息混合查询
SQLStr := Format('select * from SysFlag where Event like ''%s'' and '+
'UserName like ''%s'' and OpTime between #%s# and #%s#',
['%'+Ed_Event.Text+'%','%'+Ed_UserName.Text+'%',
DateTostr(Dtp_OpTimeStart.Date),DateTostr(Dtp_OpTimeEnd.Date)]);
with QrySQL do
begin
Close;
SQL.Clear;
SQL.Add(SQLStr);
Open;
end;
法2:通过Parameters来传递参数,Access中yyyy-MM-dd HH:mm:ss型日期时间与其它条件混合查询。
var
SQLStr,TimeStart,TimeEnd:string;
begin
//混合查询
TimeStart := FormatDateTime('yyyy-MM-dd',Dtp_OpTimeStart.Date)+' '+
FormatDateTime('HH:mm:ss',Dtp_OpTimeTimeStart.Time);
TimeEnd := FormatDateTime('yyyy-MM-dd',Dtp_OpTimeEnd.Date)+' '+
FormatDateTime('HH:mm:ss',Dtp_OpTimeTimeEnd.Time);
SQLStr := 'select * from SysFlag where Event like :c and UserName like :d'+
' and OpTime >= :a and OpTime <= :b';
//SQLStr := 'select * from SysFlag where Event like :c and UserName like :d'+
//' and OpTime between :a and :b';
with QrySQL do
begin
Close;
SQL.Clear;
SQL.Add(SQLStr);
Parameters.ParamByName('c').Value := '%'+Trim(Ed_Event.Text)+'%';
Parameters.ParamByName('d').Value := '%'+Trim(Ed_UserName.Text)+'%';
Parameters.ParamByName('a').Value := TimeStart;
Parameters.ParamByName('b').Value := TimeEnd;
Open;
end;
end;
注意:
用between 。。and。。查询yyyy-MM-dd型日期,若同一天,between后的日期要比and后的日期少1天,between后代表当天。
用between 。。and。。查询yyyy-MM-dd HH:mm:ss型时间,若同一秒,between后的时间要比and后的时间少1秒,and后代表当前秒数。
用>= 和 <= 查询,前后日期时间无差别。
用Parameters参数传递,不加#号更方便。