Delphi 如何将TDateTime转换为在Oracle SQL请求中使用?
我使用Oracle数据库,并使用FireDAC访问它。 我需要在SELECTSQL请求中添加两个由用户选择的特定日期。为此,我使用了两个TDateTimePicker组件 我使用DateTimeToStr()转换来自TDateTimePicker的日期,并构建如下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)+''''
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
,没有任何分隔符。谢谢,学习了!对不起,我的英语不好,:)