【问题标题】:How to filter FireDAC dataset by a DATE value constant?如何通过 DATE 值常量过滤 FireDAC 数据集?
【发布时间】:2018-06-24 21:48:17
【问题描述】:
procedure TForm2.Button1Click(Sender: TObject);
begin
  with qryWithFilter do
  begin
    Filtered := False;
    OnFilterRecord := nil;
    // date separator may be used any from [' ', '-', '\', '.', '/']
    // Filter := 'DATA_NAS < (''DatetoStr(date3)'')';
    // Filter := 'DATA_NAS < ''28/06/1939''';
    // Filter := 'DATA_NAS < (FormatDateTime(''dd/mm/yyyy'', ''28/06/1968''))';
    // Filter := 'DATA_NAS < TO_DATE(''1996-07-29'',''yyyy-mm-dd'')';
    Filter := 'DATA_NAS < (TO_DATE(''1996-07-29'',''yyyy-mm-dd''))';
    Filtered := True;
  end;
end;

仅适用于“28/06/1968”。我得到的错误是:

如何按 DATE 值常量过滤我的 FireDAC 查询?

【问题讨论】:

    标签: delphi firebird firedac


    【解决方案1】:

    FireDAC 的 Filter 属性实现不支持 DBMS 函数,但为您提供了自己的表达式引擎。

    使用 FireDAC 将字符串常量转换为 Filter 属性表达式中的 DATE 类型值可以像使用 CONVERT 宏函数或 {d} 转义序列一样简单。然后,表达式引擎会为您选择一个 DBMS 特定的转换函数。

    尝试以下过滤器之一(所有变体的日期字符串格式为 yyyy-mm-dd):

    uses
      FireDAC.Stan.ExprFuncs;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with FDQuery do
      begin
        { disable filter }
        Filtered := False;
        { filter with date escape sequence (is nicely readable) }
        Filter := 'DATA_NAS < {d 1996-07-29}';
        { filter with CONVERT macro function without function escape sequence }
        Filter := 'DATA_NAS < {CONVERT(''1996-07-29'', DATE)}';
        { filter with CONVERT macro function with function escape sequence }
        Filter := 'DATA_NAS < {fn CONVERT(''1996-07-29'', DATE)}';
        { enable filter }
        Filtered := True;
      end;
    end;
    

    【讨论】:

    • FireDAC 的转义序列不是仅对生成 RDBMS 无关的 SQL 有用吗?过滤器由 FireDAC 自己处理,它们不应该需要这种“独立的方法”。我认为应该有一种用于编写日期的原生格式,以便过滤器理解它们(但我不知道是哪种)。
    猜你喜欢
    • 2018-08-16
    • 2019-05-01
    • 2016-04-25
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多