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

Delphi 如何将TDateTime转换为在Oracle SQL请求中使用?,delphi,delphi-2010,firedac,Delphi,Delphi 2010,Firedac,我使用Oracle数据库,并使用FireDAC访问它。 我需要在SELECTSQL请求中添加两个由用户选择的特定日期。为此,我使用了两个TDateTimePicker组件 我使用DateTimeToStr()转换来自TDateTimePicker的日期,并构建如下SQL请求: FormRelatorio.FDQuery1.SQL.Add('and(PCPEDC.DTFAT) BETWEEN' + ''''+DatetoSTR(DateTimeInicial.Date)+''''

我使用Oracle数据库,并使用FireDAC访问它。 我需要在SELECTSQL请求中添加两个由用户选择的特定日期。为此,我使用了两个TDateTimePicker组件

我使用DateTimeToStr()转换来自TDateTimePicker的日期,并构建如下SQL请求:

FormRelatorio.FDQuery1.SQL.Add('and(PCPEDC.DTFAT) BETWEEN' +
        ''''+DatetoSTR(DateTimeInicial.Date)+'''' + 'and' +
        ''''+DatetoSTR(DateTimeFinal.Date)+'''');
不幸的是,我从数据库得到一个语法错误,因为数据库不接受也不自动调整系统从月份到数字,只接受它们的首字母缩写和英语(例如:一月、二月、三月等)


是否有可能更改结果?

这不是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可用于检查我写的内容。我是从头开始做的。您已经有了这样的想法…

这不是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可用于检查我写的内容。我是从头开始做的。您已经有了这样的想法…

您不应该通过连接字符串来创建SQL。这会导致问题(例如,对于包含撇号的字符串)和安全漏洞(SQL注入)。你现在遇到的这个问题。解决方案是使用参数化查询
从年龄=:Age
后跟
MyQuery.ParamByName('Age')的人员中选择姓名。AsInteger:=MyInt
。不应通过连接字符串来创建SQL。这会导致问题(例如,对于包含撇号的字符串)和安全漏洞(SQL注入)。你现在遇到的这个问题。解决方案是使用参数化查询
从年龄=:Age
后跟
MyQuery的人名中选择姓名。ParamByName('Age')。AsInteger:=MyInt
。Oracle的
TO_DATE()
接受任何组合,而不仅仅是整个格式-还可以使用直接的
yyyyymmdd
并提供
20190530
,没有任何分隔符。谢谢,我已经学会了!对不起,我的英语不好,:)Oracle的
TO_DATE()
接受任何组合,而不仅仅是整个格式-您还可以使用直接的
YYYYMMDD
并提供
20190530
,没有任何分隔符。谢谢,学习了!对不起,我的英语不好,:)