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

问题描述

我使用 Oracle 数据库并使用 FireDAC 访问它。 我需要在选择 sql 请求中添加用户选择的两个特定日期。为此,我使用了两个 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 字符串,因此您必须以 DB 接受的格式为自己提供从日期到字符串的转换。这是可能的,但不是这样做的方法。

相反,请使用参数化 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;

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

如果 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 DB 来检查我写的内容。我是从头脑中做到的。你有这个想法...