0

我想知道您是否可以看一下我在 Delphi 上进行日期比较的代码。

DELPHI 中的代码片段:-

        // SQL QUERY to gather member information.
           DMS.ADOQuery1.SQL.Clear;
           DMS.ADOQuery1.SQL.Add('select HPFROMDT, HPthruDt, MEMBERKEY, MEMBHPKEY, OPFROMDT, OPTHRUDT, HPCODEKEY' +
                                 ' from MEMBHP' +
                                 ' where MEMBERKEY = ''' + MembKey + '''   and OPFROMDT <= ''' + date_request + ''' and OPTHRUDT > ''' + date_request +''' '

SQL 中的脚本片段:-

SELECT [MEMBHPKEY]
      ,[MEMBERKEY]
      ,[CURRHIST]
      ,[HPFROMDT]
      ,[OPFROMDT]
      ,[OPTHRUDT]
      ,[HPCODEKEY]
      ,[HPOPTIONKEY]

  FROM [main].[dbo].[*****]

  where MEMBERKEY = '1234567' and OPFROMDT <= '2007-08-01' and OPTHRUDT > '2007-08-01'

SQL 脚本显然将固定日期值与提取的日期值进行比较。它有效!

但是,Delphi 代码不起作用。错误信息

将字符串转换为 smalldatetime 日期类型时转换失败。

我相信 Delphi 必须有某种转换技术,可以让我转换成正确的变量类型……。有任何想法吗?

我从文本文件中提取date_request为字符串变量....

  for i := 11 to length(buffer) do
                        begin
                             DT_request := DT_request + buffer[i];
                        end;
4

3 回答 3

4

使用日期(TDateTime值)来表示日期,并使用参数化查询让数据库驱动程序将它们转换为正确的格式。

// New code snippet from Delphi:
DMS.ADOQuery1.SQL.Clear;
DMS.ADOQuery1.SQL.Add('select HPFROMDT, HPthruDt, MEMBERKEY, MEMBHPKEY, OPFROMDT, OPTHRUDT, HPCODEKEY');
DMS.ADOQuery1.SQL.Add('from MEMBHP where MEMBERKEY = :MembKey and OPFROMDT <= :date_request and');
DMS.ADOQuery1.SQL.Add('and OPTHRUDT > :date_request');
DMS.ADOQuery1.Parameters.ParamByName('MembKey'.AsString := MembKey;
DMS.ADOQuery1.Parameters.ParamByName('date_request').AsDateTime := ARealDateTimeValue;
DMS.ADOQuery1.Parameters.ParamByName('date_request') := ARealDateTimeValue;

如果您从文本文件中获取字符串,您必须首先确保它的格式适合您的数据库。根据您的信息,那将是CCYY-MM-DD格式。然后,您可以使用AsString而不是AsDateTime将值分配给参数。

于 2012-10-29T16:22:03.843 回答
1

使用参数...

AdoQuery1.SQL.TExt:
Declare @Date smalldatetime
Select @Date=:Date
SELECT [MEMBHPKEY]
       ,[MEMBERKEY]
       ,[CURRHIST]  
       ,[HPFROMDT]
       ,[OPFROMDT]
       ,[OPTHRUDT]
       ,[HPCODEKEY]
       ,[HPOPTIONKEY] 
FROM [main].[dbo].[MEMBHP]
where MEMBERKEY =:memberkey and OPFROMDT <= @Date and OPTHRUDT > @Date

AdoQuery1.Parameters.ParseSQL(AdoQuery1.SQL.TExt,true);
AdoQuery1.Parameters.ParamByName('Date').DataType := ftDatetime;
AdoQuery1.Parameters.ParamByName('Date').Value := StrToDate('1.1.2012');
AdoQuery1.Parameters.ParamByName('memberkey').Value := 123;
于 2012-10-29T16:14:55.637 回答
0

提取过程在日期结束时拾取垃圾“*”值。这是 SQL 中日期比较期间的问题。

我用了

Showmessage(DMS.ADOQuery1.SQL[0]);

它向我表明 date_request 实际上导致了'20070815 *'......一旦我弄清楚了,这很容易解决。删除 '*' 并像以前一样进行比较。

// SQL QUERY to gather member information.
DMS.ADOQuery1.SQL.Clear;
DMS.ADOQuery1.SQL.Add('select HPFROMDT, HPthruDt, MEMBERKEY, MEMBHPKEY, OPFROMDT, OPTHRUDT, HPCODEKEY' +
                       ' from MEMBHP' +
                       ' where MEMBERKEY = ''' + MembKey + '''   and OPFROMDT <= ''' + date_request + ''' and OPTHRUDT > ''' + date_request +''' '
于 2012-10-29T16:43:38.577 回答