我想知道您是否可以看看我在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代码不起作用。错误信息
将字符串转换为小日期类型时,转换失败。
我相信德尔福必须有某种转换技术,它应该允许我转换成正确的变量类型…。。有什么想法吗?
我从文本文件中提取date_request作为字符串变量.
for i := 11 to length(buffer) do
begin
DT_request := DT_request + buffer[i];
end;发布于 2012-10-29 16:43:38
提取过程是在日期结束时捡起一个垃圾“*”值。这是在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-29 16:22:03
使用日期(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-29 16:14:55
使用参数..。
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;https://stackoverflow.com/questions/13125373
复制相似问题