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 に答える