En supposant PayDate
est défini comme date
/datetime
Dans MSSQL, vous pouvez utiliser les paramètres comme suit:
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;
Je changerais aussi cashNum
au paramètre IE:
...
+' where idCashReason=1 and idCashClause=8 and cashNum=:cashNum'+
...
qryTemp.Parameters.ParamByName('cashNum').Value := i;
Préférez toujours utiliser des types de données compatibles avec vos paramètres, plutôt que la mise en forme et l'utilisation de chaînes. SQL n'a pas besoin de deviner vos types de données si vous pouvez les définir explicitement.
Noter: IIF
a été introduit dans SQL Server 2012. Pour une version ancienne CAS expression.
Dans les versions de Delphi non Unicode plus anciennes, les paramètres ont un problème avec Unicode.
Donc, si tu ne le faites pas Utilisez des paramètres que vous pouvez utiliser ce qui suit:
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;
Et votre requête sera la suivante:
...
+' and PayDate<' + SqlDateTimeStr(Date, True)
...