sql - 使用参数的 SQL 日期查询 - Delphi
问题描述
我有一个 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()';
,但没有运气,有没有正确的方法可以做到这一点,或者它实际上必须在查询中而不是参数化?我想这样做的原因是,我将根据按下的按钮有多个不同的查询,但唯一改变的是那些参数化的日期。
解决方案
A parameter can't be a function, it has to be a value. You are assigning strings as those values, and those strings do not represent valid dates. That is why you are getting a mismatch error.
You can use Delphi Date()
function, and pass the returned TDate
as a parameter value:
Qry.Params.ParamByName('dateA').Value := Date();
Qry.Params.ParamByName('dateB').Value := Date()+6;
Or, you can use Access's Date()
function in the SQL itself:
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;';
推荐阅读
- react-leaflet - 反应传单测量/标尺插件
- asp.net-core - 如何使用 OpenIddict 验证处理程序交换令牌的授权代码并从 cookie 中检索存储的令牌?
- sql-server - 我们如何从填充函数变量中提取值进行处理
- python - on_raw_reaction_add() 每条消息只工作一次吗?
- c - 使用指针算法对数组进行排序
- android - 一个多因素如何对 API 进行身份验证?
- javascript - html中的随机javascript图像
- windows - 为什么characteristic.ReadValueAsync() 有时会抛出ObjectDisposedException?
- c# - 什么是匹配逗号-引号-逗号的正则表达式?
- android - 中心裁剪比例类型在 android 图像视图中不起作用