我正在尝试使用组合框为自己使用 delphi 10.4 在应用程序中选择记录
if cbResultDisplaySelect.ItemIndex = 1 then
begin
d1 := DateTimePicker1.Date;
d2 := DateTimePicker2.Date;
mmdata.labRstQry.Active := false;
mmdata.labRstQry.SQL.Clear;
mmdata.labRstQry.SQL.Add('select * from labs ');
mmdata.labRstQry.SQL.Add('where ldate Between ' + DateToStr(d1) + ' and ' + DatetoStr(d2));
mmdata.labRstQry.SQL.Add(' group by ldate, ltestname order by ltestname, ldate DESC');
mmdata.labRstQry.Active := true;
end else...
它一直返回空结果。
如果我在 SqliteStudio 的 sql 编辑器中编写它,它就可以工作:
select * from labs where ldate BETWEEN '2022-09-01' and '2022-12-31';
我尝试将日期时间选择器中的日期格式化为“yyyy-MM-dd”,但它也没有用。这一定是我做错或遗漏的非常基本的事情
在查询中,您应该使用 FormatDateTime('yyyymmdd', d1)。 DateToStr(d1) 取决于语言环境,您无法预测它将如何格式化您的日期。 你的日期需要被 QuotedStr.
所以最后:QuotedStr(FormatDateTime('yyyymmdd', d1))
你的代码会像这样:
select * from labs where ldate BETWEEN 09/01/2022 and 12/31/2022
如果你使用 QuotedStr 和 FormatDateTime 你得到
select * from labs where ldate BETWEEN '20220901' and '20221231'
你最好学习如何编写带参数的查询。 我还没有测试过,但你的代码看起来像这样:
mmdata.labRstQry.SQL.Add('select * from labs ');
mmdata.labRstQry.SQL.Add('where ldate Between :begindate and :enddate';
mmdata.labRstQry.SQL.Add(' group by ldate, ltestname order by ltestname, ldate DESC');
mmdata.labRstQry.ParamByName('begindate').Value := d1;
mmdata.labRstQry.ParamByName('enddate').Value := d2;
mmdata.labRstQry.Active := true;
参数有时会有点挑剔,比如不要在一个查询中两次使用相同的参数。