首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ADO和SQL Server时未正确计算日期参数

使用ADO和SQL Server时未正确计算日期参数
EN

Stack Overflow用户
提问于 2011-09-10 04:53:55
回答 6查看 6.3K关注 0票数 1

我有以下SQL语句:

代码语言:javascript
运行
复制
SELECT 420, DueDate, ISNULL(Amount, 0) 
FROM Payments
WHERE CurveID = ? AND DueDate >= ?;

这是我使用Delphi2010和TADODataset执行的。除了子句DueDate >= ?的计算不正确之外,该语句可以正确执行。如果我为第二个参数传入Date()Now(),我会在DueDate字段中得到日期早于今天的返回值。

在SSMS中,如果我将date参数替换为格式为'2011-09-09‘的字符串,则可以成功运行此SQL查询:

代码语言:javascript
运行
复制
SELECT 420, DueDate, ISNULL(Amount, 0) 
FROM Payments
WHERE CurveID = 19 AND DueDate >= '2011-09-09';

然而,回到Delphi语言中,即使我将参数值设置为这种格式的日期的字符串形式,也会得到不正确的结果(可能是因为TADODataset正确地将字符串转换回了日期)。

除了用硬编码到SQL中的日期构建动态SQL之外,我必须做什么才能正确地计算它?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-12 23:24:31

以下是我的问题的解决方案:

我使用TADOCommand对数据库执行SQL (而不是我在问题中错误地写成的TADODataset,oops)。切换到TADOQuery解决了这个问题。执行SQL接口在这两个类之间是不同的,并且TADOQuery明确地在dataset的parameters属性中查找它的参数。TADOCommand有一个Parameters属性,但也接受一个参数数组作为.Execute()方法的参数。

有了TQuery,我的参数就可以被正确地输入,而不需要我额外的努力。这适用于位置或命名参数。

票数 0
EN

Stack Overflow用户

发布于 2011-09-10 05:41:49

使用(命名的)参数,类似于

代码语言:javascript
运行
复制
Query.CommandText := 'SELECT 420, DueDate, ISNULL(Amount, 0) FROM Payments '+
                     'WHERE CurveID = :CurveID AND DueDate >= :DueDate';
Query.Prepared := True;
Query.Parameters.ParamValues['CurveID'] := 19;
Query.Parameters.ParamValues['DueDate'] := EncodeDate(2011, 9, 9);
Query.Active := True;

这也允许你在系统不正确的情况下设置参数的类型。

代码语言:javascript
运行
复制
Query.Parameters.ParamByName('DueDate').DataType := ftDate;

另请注意,ADODataSet的ParamCheck属性必须为true (默认值)才能使用:name样式参数。

票数 2
EN

Stack Overflow用户

发布于 2011-09-10 04:58:43

请尝试以下操作:

代码语言:javascript
运行
复制
AND DueDate >= CONVERT(datetime,?);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7367336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档