我在Delphi中使用UniQuery传递MySQL查询,它返回NULL。
我已经更改了TDBDateTimeEditEh属性中的日期格式,使其与mysql格式yyyy-mm-dd匹配,并在运行时将其传递给我的字符串变量。
下面是我的代码:
procedure TfrmPayroll.Button1Click(Sender: TObject);
var
DateRangeQry, StartDate, EndDate : string;
begin
StartDate := dthStart.Text;
EndDate := dthEnd.Text;
DateRangeQry := 'SELECT * FROM mytimesheet WHERE Date >= '+ StartDate +' AND date <= '+ EndDate +'';
//ShowMessage(StartDate +' to '+ EndDate); // result yyyy-mm-dd to yyyy-mm-dd
with dm_u.dmPayroll do
begin
uqMyTimesheet.SQL.Clear;
uqMyTimesheet.sql.Text := DateRangeQry;
uqMyTimesheet.ExecSQL;
cdsMyTimesheet.Refresh;
end;
end;我检查了showmessage中的值,它与mysql中的日期格式匹配。
我假设我的代码会在指定的日期范围内从数据库中生成一系列记录,但没有用。
我将非常感谢你们的帮助。
更新:

发布于 2019-07-31 16:22:24
使用参数而不是旧的连接查询方式,更好,更清晰,而且它永远有效!试试这段代码。
procedure TForm5.Button1Click(Sender: TObject);
var
DateRangeQry, StartDate, EndDate : string;
begin
StartDate:='01/01/2019';
EndDate:='01/01/2020';
DateRangeQry:='SELECT * FROM mytimesheet WHERE Date >= :StartDate AND date <= :EndDate';
uqMyTimesheet.SQL.Text:=DateRangeQry;
uqMyTimesheet.ParamByName('StartDate').AsDate := StrToDate(StartDate);
uqMyTimesheet.ParamByName('EndDate').AsDate := StrToDate(EndDate);
uqMyTimesheet.Open;
end;当您有不同的日期格式时,另一种方法是将日期转换为字符串
StartDate:='2019-01-01';
EndDate:='2020-01-01';
DateRangeQry:='SELECT * FROM mytimesheet WHERE DATE_FORMAT(Date, ''%Y-%m-%d'') between :StartDate AND :EndDate';
UniQuery1.SQL.Text:=DateRangeQry;
UniQuery1.ParamByName('StartDate').AsString := (StartDate);
UniQuery1.ParamByName('EndDate').AsString := (EndDate);
UniQuery1.Open;发布于 2019-08-02 07:53:33
请改用参数化查询,使用TDate代替string作为参数值,例如:
procedure TfrmPayroll.QueryTimeSheet(StartDate, EndDate: TDate);
begin
//ShowMessage(DateToStr(StartDate) + ' to ' + DateToStr(EndDate)); // result yyyy-mm-dd to yyyy-mm-dd
with dm_u.dmPayroll do
begin
uqMyTimesheet.SQL.Text := 'SELECT * FROM mytimesheet WHERE Date >= :PStartDate AND date <= :PEndDate';
uqMyTimesheet.ParamByName('PStartDate').AsDate := StartDate;
uqMyTimesheet.ParamByName('PEndDate').AsDate := EndDate;
uqMyTimesheet.ExecSQL;
cdsMyTimesheet.Refresh;
end;
end;
procedure TfrmPayroll.Button1Click(Sender: TObject);
begin
QueryTimeSheet(dthStart.Value, dthEnd.Value);
end;https://stackoverflow.com/questions/57283415
复制相似问题