如何将 TDateTime 转换为在 Oracle SQL 请求中使用?

How to convert TDateTime to be used in a Oracle SQL request?

我使用 Oracle 数据库并使用 FireDAC 访问它。 我需要向 select SQL 请求添加两个由用户编辑的特定日期 select。为此,我使用了两个 TDateTimePicker 组件。

我使用 DateTimeToStr() 从 TDateTimePicker 转换日期并构建 SQL 请求,如下所示:

FormRelatorio.FDQuery1.SQL.Add('and(PCPEDC.DTFAT) BETWEEN' +
        ''''+DatetoSTR(DateTimeInicial.Date)+'''' + 'and' +
        ''''+DatetoSTR(DateTimeFinal.Date)+'''');

不幸的是,我从数据库中收到语法错误,因为数据库不接受也不自动将系统从月份调整为数字,只接受它们的首字母缩写词和英文(例如:JAN、FEB、MAR 等... ).

是否有可能改变结果?

这不是 TDateTimePicker 问题。如何将 TDateTime(日期和时间的 Delphi 数据类型)传递给 SQL 查询是一个问题。目前您构建了一个 SQL 字符串,因此您必须以数据库接受的格式为自己提供从日期到字符串的翻译。这是可能的,但不是办法。

相反,使用参数化 SQL 查询,FireDAC 将为您完成工作:

FormRelatorio.FDQuery1.SQL.Add('and (PCPEDC.DTFAT BETWEEN :InicialDate and :FinaleDate)');
FormRelatorio.FDQuery1.ParamByName('InicialDate ').AsDateTime := DateTimeInicial.Date;
FormRelatorio.FDQuery1.ParamByName('FinaleDate').AsDateTime := DateTimeFinal.Date;

如果数据库中的列定义正确(您没有显示 table 结构),这将正常工作。

如果 FireDAC 没有做正确的工作,您可以使用 Oracle 的 TO_DATE 函数和 Delphi FormatDateTime:

FormRelatorio.FDQuery1.SQL.Add('and (PCPEDC.DTFAT BETWEEN TO_DATE(''' + FormatDateTime('DD/MM/YYYY', DateTimeInicial.Date) + ''', 'DD/MM/YYYY') and
TO_DATE(''' + FormatDateTime('DD/MM/YYYY', DateTimeFinal.Date) + ''', 'DD/MM/YYYY'));

Oracle 的 TO_DATE 也接受格式 DD/MM/YYYY 和 Delphi 的 FormatDateTime。这样可以避免指定月份名称。

免责声明:我没有可用的 Oracle 数据库来检查我写的内容。我是从头开始做的。你有想法...