【问题标题】:Is it possible in SQL to use a FieldByName function when using an alias field使用别名字段时是否可以在 SQL 中使用 FieldByName 函数
【发布时间】:2020-07-29 19:08:10
【问题描述】:

我在 Delphi 中使用 MS Access 数据库。我想提取两个日期字段Date In和Date Out之间的差异;在表中,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 field: 'DateDiff' not found”。 我假设错误消息来自inights := fieldbyname['DateDiff'].asInteger 代码。

我还是 SQL 的新手,任何帮助都将不胜感激。

【问题讨论】:

  • 您忘记打开查询了。
  • 不要使用保留字作为名称。 DateDiff 是一个保留字 - 内在函数。如果您坚持使用 then 括在 [ ] 字符中:AS [DateDiff] 但不要让自己恶化,不要这样做。
  • 我会改的,谢谢你的建议。
  • 您能否养成在您的 q 中包含相关信息的习惯,在这种情况下是您的 qryguestinfo 表的数据类型。顺便说一句,除非您在 IDE 中的表上创建持久字段,否则在您打开表之前,“DateDiff”fiekd 不会实际存在。
  • @MartynA,我不知道我的 qryguestinfo 表可能有数据类型,还是您指的是表中的字段数据类型?

标签: sql ms-access delphi


【解决方案1】:

恐怕另一个答案是不正确地指出 DateDiff 只能在 Access 中使用。

以下在 Delphi 中使用 Microsoft.ACE.OLEDB.16.0 提供程序可以正常工作:

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

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

顺便说一句,您的 q 答案是合格的“是”。如果您不使用持久 TFields(通过右键单击数据集并选择“字段编辑器”在 IDE 中创建的字段),则在打开表之前不会实际创建字段,之后您可以使用 FieldByName 直到 数据集已关闭。如果创建持久 TField,则字段始终存在,但仍只能在数据集打开时用于获取(或设置)字段值。创建持久字段的最简单方法是在 IDE 中设置查询的 SQL.Text,然后使用 FieldEditor 上下文菜单中的“添加所有字段”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2023-03-17
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多