使用参数的SQL日期查询-Delphi

时间:2019-02-26 09:53:54

标签: sql delphi ms-access

我有一个SQL查询(MS Access),我想将Date()函数添加到参数中,但是出现错误:[ODBC Microsoft Access Driver]Data type mismatch in criteria expression. 这是代码:

Qry.SQL.Text := 'SELECT Bookings.Date, Bookings.WeekDay, Bookings.Shift, Bookings.Start, Bookings.Finish,'
    + ' Bookings.DateFinish, Wards.WardName'
    + ' FROM Bookings'
    + ' INNER JOIN Wards ON Bookings.WardNo = Wards.WardNo'
    + ' WHERE (Bookings.NurseNo=:nurseID) AND (Bookings.Date BETWEEN :dateA AND :dateB)'
    + ' ORDER BY Bookings.Date ASC;';

Qry.Params.ParamByName('dateA').Value := 'Date()';
Qry.Params.ParamByName('dateB').Value := 'Date()+6';

我也尝试过Qry.Params.ParamByName('dateA').AsString := 'Date()';,但是没有运气,是否有正确的方法来执行此操作,或者它实际上必须在查询中而不是参数化?我想这样做的原因是,根据按下哪个按钮,我将有多个不同的查询,但是唯一改变的是那些参数化的日期。

1 个答案:

答案 0 :(得分:2)

参数不能是函数,必须是值。您正在将字符串指定为这些值,并且这些字符串不表示有效日期。这就是为什么您会遇到不匹配错误的原因。

您可以使用Delphi Date()函数,并将返回的TDate作为参数值传递:

Qry.Params.ParamByName('dateA').Value := Date();
Qry.Params.ParamByName('dateB').Value := Date()+6;

或者,您可以在SQL本身中使用Access的Date()函数:

Qry.SQL.Text := 'SELECT Bookings.Date, Bookings.WeekDay, Bookings.Shift, Bookings.Start, Bookings.Finish,'
    + ' Bookings.DateFinish, Wards.WardName'
    + ' FROM Bookings'
    + ' INNER JOIN Wards ON Bookings.WardNo = Wards.WardNo'
    + ' WHERE (Bookings.NurseNo=:nurseID) AND (Bookings.Date BETWEEN Date() AND Date() + 6)'
    + ' ORDER BY Bookings.Date ASC;';