首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中使用带有可变字符串日期值的UniQuery传递MySQL日期范围查询时返回NULL

在Delphi中使用带有可变字符串日期值的UniQuery传递MySQL日期范围查询时返回NULL
EN

Stack Overflow用户
提问于 2019-07-31 12:53:13
回答 2查看 667关注 0票数 1

我在Delphi中使用UniQuery传递MySQL查询,它返回NULL。

我已经更改了TDBDateTimeEditEh属性中的日期格式,使其与mysql格式yyyy-mm-dd匹配,并在运行时将其传递给我的字符串变量。

下面是我的代码:

代码语言:javascript
复制
    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中的日期格式匹配。

我假设我的代码会在指定的日期范围内从数据库中生成一系列记录,但没有用。

我将非常感谢你们的帮助。

更新:

EN

回答 2

Stack Overflow用户

发布于 2019-07-31 16:22:24

使用参数而不是旧的连接查询方式,更好,更清晰,而且它永远有效!试试这段代码。

代码语言:javascript
复制
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;

当您有不同的日期格式时,另一种方法是将日期转换为字符串

代码语言:javascript
复制
  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;
票数 3
EN

Stack Overflow用户

发布于 2019-08-02 07:53:33

请改用参数化查询,使用TDate代替string作为参数值,例如:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57283415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档