Sqlite 在TFDTable.Filter表达式中使用时未找到DATETIME函数
我正在使用FireDAC和SQLite驱动程序。(德尔福东京10.2.3) 在查询表达式中使用Sqlite 在TFDTable.Filter表达式中使用时未找到DATETIME函数,sqlite,delphi,firedac,Sqlite,Delphi,Firedac,我正在使用FireDAC和SQLite驱动程序。(德尔福东京10.2.3) 在查询表达式中使用DATETIME效果很好: with Query1 do begin Close; SQL.Text := 'select DATETIME(start_time) from times where ' + 'DATETIME(start_time) >= DATETIME("2019-02-01 00:00:00")'; Open; ....
DATETIME
效果很好:
with Query1 do
begin
Close;
SQL.Text := 'select DATETIME(start_time) from times where ' +
'DATETIME(start_time) >= DATETIME("2019-02-01 00:00:00")';
Open;
....
end;
但是,如果我尝试将类似的表达式指定给TFDTable.Filter:
tblTimes.Filter := 'DATETIME(start_time) >= DATETIME("2019-02-01 00:00:00")';
tblTimes.Filtered := True;
它会导致以下错误:
[FireDAC][Stan][Eval]-100。找不到列或函数[DATETIME]。提示:如果名称是函数名,则将FireDAC.Stan.ExprFuncs添加到uses子句
注意:FireDAC.Stan.ExprFuncs已在uses子句中
怎么了?这样的表达式可以在Filter子句中使用吗(在D7中使用aducom组件对我来说效果很好)?试试这个:
tblTimes.Filter := 'start_time >= {dt 2019-02-01 00:00:00}';
tblTimes.Filtered := True;
请阅读以下内容:
在大多数情况下,查询的筛选是在本地用Delphi代码完成的,而不是在数据库引擎中完成的。如果它支持的有限过滤不够,您可以使用OnFilterRecord在您自己的代码中进行过滤。ref:DATETIME()是SQLite函数,因此可以在查询sql中使用。在FD Dataset.Filter中,只能使用FD宏函数,DATETIME()不是内置的宏函数。@Branko存在例外情况-例如,对于实时数据窗口模式下的TFDTable,筛选器表达式将在WHERE子句中传递给数据库引擎(如我在上面链接的文章底部附近所述)@布莱恩:谢谢你的信息。如果您愿意回答,我将接受。使用LDW必须是一个很好的理由,如果您不熟悉LDW的所有限制和建议,请不要使用LDW。一般来说,避免使用FDTable,而是使用FDQuery。不确定这对我有什么帮助。我需要对
start\u time
应用一个函数以获得所需的结果。我假设start\u time
是TDataSet中的列。什么数据类型是start\u time
列?它被声明为DATETIMEOK,所以我的答案正是您需要的。不,您不必使用任何函数。对于FireDAC,标记为“{dt}”的值被视为日期时间值。只需尝试并分享您的结果:)不需要通过OnFilterRecord
事件进行过滤,因为在FireDAC中进行过滤的可能性非常大。此外,它需要一个事件处理程序,而不是将筛选器表达式传递给DataSet.filter