为什么这段代码在 Delphi 中使用sqlite3返回0条记录

z2acfund  于 2023-04-30  发布在  SQLite
关注(0)|答案(1)|浏览(154)

我试图使用一个组合框来选择记录在一个应用程序为自己使用 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';

我试过从datetimepicker格式化日期为'yyyy-MM-dd',它也不起作用。一定是我做错了或遗漏了一些很基本的东西

egdjgwm8

egdjgwm81#

在查询中,您应该使用FormatDateTime('yyyymmdd ',d1)。DateToStr(d1)依赖于区域设置,您无法预测它将如何格式化您的日期。你的约会需要报价。
所以最后: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;

参数有时候会有点挑剔,比如不要在一个查询中使用同一个参数两次。

相关问题