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

问题描述 投票:0回答:1

我正在尝试使用组合框为自己使用 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”,但它也没有用。这一定是我做错或遗漏的非常基本的事情

sqlite delphi
1个回答
1
投票

在查询中,您应该使用 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;

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

© www.soinside.com 2019 - 2024. All rights reserved.