在 SQL 中使用别名字段时是否可以使用 FieldByName 函数

Is it possible in SQL to use a FieldByName function when using an alias field

我在 Delphi 中使用 MS Access 数据库。我想提取两个日期字段 Date In 和 Date Out 之间的差异;在 table、tblGuestInfo。我想将这两个日期之间的差异保存为整数变量inights。

我有以下代码。

with datamod.qryguestinfo do 
begin
 close;
 sql.clear
 sql.add('SELECT DATEDIFF ("d","[Date In]","[Date Out]") As DateDifference')
 sql.add('From tblGuestInfo');
 open;
 inights := fieldbyname['DateDifference'].asInteger;
 open;
end;

当我运行它时,出现如下错误信息“qryguestinfo字段:'DateDiff'未找到”。 我假设错误消息来自 inights := fieldbyname['DateDiff'].asInteger 代码。

我在 SQL 还很陌生,我们将不胜感激。

恐怕另一个答案是错误的,因为 DateDiff 只能在 Access 中使用。

使用 Microsoft.ACE.OLEDB.16.0 提供商,以下内容在 Delphi 中运行良好:

procedure TForm1.FormCreate(Sender: TObject);
begin
  AdoQuery1.SQL.Text := 'select id, DateDiff(''d'', Field1, Field2) as DiffInDays from table1';
  AdoQuery1.Open;
end;

因此无需在 Access 中执行任何操作即可获得所需的结果。

顺便说一句,您的问题的答案是合格的“是”。如果您不使用持久性 TFields(通过右键单击数据集并选择 'Fields Editor' 在 IDE 中创建的字段),则在 table 打开之前不会实际创建字段,之后您可以使用 FieldByName until 数据集关闭。如果您创建持久性 TFields,那么这些字段将一直存在,但仍然只能在数据集打开时用于获取(或设置)字段值。创建持久字段的最简单方法是在 IDE 中设置查询的 SQL.Text,然后使用 FieldEditor 上下文菜单中的 'Add all fields'。