[英]Passing MySQL date range query in Delphi using UniQuery with variable string date values gives me returns NULL
I am passing MySQL query using UniQuery in Delphi and it is returing NULL. 我通过在Delphi中使用UniQuery传递MySQL查询,并且正在重试NULL。
I already change the date format in the property of my TDBDateTimeEditEh to match with mysql format yyyy-mm-dd and pass this to my string variable at runtime. 我已经更改了TDBDateTimeEditEh属性中的日期格式,使其与mysql格式yyyy-mm-dd相匹配,并在运行时将其传递给我的字符串变量。
Here's my code: 这是我的代码:
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;
I did check the value in the showmessage and it is matching the date format in mysql. 我确实检查了showmessage中的值,它与mysql中的日期格式匹配。
I supposed my codes about would generate range of records from the database within the date range specified but no avail. 我以为我的代码将在指定的日期范围内从数据库生成记录范围,但无济于事。
I will appreciate any help from you guys. 谢谢您的任何帮助。
Updates: 更新:
Using parameters instead of OLD concatenated queries style, is better, clear and it works ever! 使用参数代替OLD串联查询样式会更好,更清晰,并且永远有效! Try this code. 试试这个代码。
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;
Another approach when you have different date formats is convert date to string 日期格式不同时的另一种方法是将日期转换为字符串
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;
Use a parameterized query instead, using TDate
instead of string
for the parameter values, eg: 使用参数化查询代替,使用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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.