على افتراض PayDate
يعرف ب date
/datetime
في MSSQL ، يمكنك استخدام المعلمات على النحو التالي:
qryTemp.SQL.Text:=' select top 1 iif(ComeSumm>0,comesumm,0) from cash '
+' where idCashReason=1 and idCashClause=8 and cashNum='+IntToStr(i)
+' and PayDate<:D'
+' order by payDate desc';
qryTemp.Parameters.ParamByName('D').Value := Date;
qryTemp.Parameters.ParamByName('D').DataType := ftDateTime;
سأتغير أيضا cashNum
للمعلمة أي:
...
+' where idCashReason=1 and idCashClause=8 and cashNum=:cashNum'+
...
qryTemp.Parameters.ParamByName('cashNum').Value := i;
تفضل دائمًا استخدام أنواع البيانات المتوافقة مع المعلمات الخاصة بك ، بدلاً من تنسيق السلاسل واستخدامها. لا تحتاج SQL إلى تخمين أنواع البيانات الخاصة بك إذا كان بإمكانك تعريفها بشكل صريح.
ملحوظة: IIF
تم تقديمه في SQL Server 2012. لاستخدام الإصدار الأقدم قضية التعبير.
في إصدارات Delphi الأقدم غير المرتبطة ، فإن المعلمات لديها مشكلة مع Unicode.
لذلك ، إذا كنت لا استخدم المعلمات التي يمكنك استخدام ما يلي:
function DateTimeToSqlDateTime(const DT: TDateTime): WideString;
begin
Result := FormatDateTime('yyyy-MM-dd', DT) + ' ' + FormatDateTime('hh:mm:ss', DT);
end;
function SqlDateTimeStr(const DT: TDateTime; const Is_MSSQL: Boolean): WideString;
var
S: WideString;
begin
S := DateTimeToSqlDateTime(DT);
if Is_MSSQL then
Result := Format('CONVERT(DATETIME, ''%s'', 102)', [S])
else
Result := Format('#%s#', [S]); // MS-ACCESS
end;
وسيبدو استعلامك على النحو التالي:
...
+' and PayDate<' + SqlDateTimeStr(Date, True)
...