Sql server 在查询的DATEADD函数中使用参数

Sql server 在查询的DATEADD函数中使用参数,sql-server,parameters,dateadd,Sql Server,Parameters,Dateadd,我试图在我的查询中使用SQL的功能。问题是,当我使用一个参数设置第二个参数时,我得到一个错误,它会说这样的话: 无法从转换参数值 日期时间的小数 而如果我输入无参数,即硬编码一个Int,它就可以正常工作 这项工作: SELECT FieldOne, DateField FROM Table WHERE (DateField> DATEADD(day, -10, GETDATE())) 但这并不是: SELECT FieldOne, DateFiel

我试图在我的查询中使用SQL的功能。问题是,当我使用一个参数设置第二个参数时,我得到一个错误,它会说这样的话:

无法从转换参数值 日期时间的小数

而如果我输入无参数,即硬编码一个Int,它就可以正常工作

这项工作:

SELECT     FieldOne, DateField
FROM         Table
WHERE     (DateField> DATEADD(day, -10, GETDATE()))
但这并不是:

SELECT     FieldOne, DateField
FROM         Table
WHERE     (DateField> DATEADD(day, @days, GETDATE()))
其中@days=-10

对我做错了什么有什么看法吗?顺便说一句,我在SQLServer管理器中设置了这个变量,因为我试图解决DataAccess代码中的一个错误。我不确定这是否有区别


谢谢

下面的代码在这里工作得非常好(SQL Server 2005,在Management Studio中执行):

以下情况也是如此

DECLARE @days decimal
SET @days = -10

SELECT * FROM myTable WHERE myDate > DATEADD(day, @days, GETDATE())

因此,问题一定出在其他地方…

听起来您将十进制数作为第三个参数而不是第二个参数传递给
DATEADD()
,例如:

DATEADD(day, GETDATE(), @days)
尽管问题中的片段看起来不错


(为了更清楚,上面的代码段是一个错误。这是从问题中生成错误的代码。)

您确定错误与此语句相关吗?没有小数,如果我尝试这个方法,它仍然有效

DECLARE @days decimal (19,6)
SET @days = -10.3346

--result is actually irrelevant
IF CAST(40000.6 AS decimal (19,6)) > DATEADD(day, @days, GETDATE())
    SELECT 'yes'
ELSE
    SELECT 'no'
即使尝试将-10十进制转换为smalldatetime,也会出现不同的错误

SELECT CAST(CAST(-10 AS decimal (19,6)) AS smalldatetime)

Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type smalldatetime.

我知道这是一篇老文章,但对于其他有此问题的人,我在Reporting Services 2008 R2中遇到了类似的问题,尽管错误消息是“参数数据类型nvarchar对于dateadd函数的参数2无效”。我认为这个问题可能与此有关

该问题是由Reporting Services解析SQL代码以生成报表数据集的方式引起的。在我的情况下,我可以更改此数据集查询:

SELECT  DateAdd(wk, @NumWeeks, calendar_date) AS ToWeekFromDate
FROM dim_date
为此:

SELECT  DateAdd(wk, Convert(Int, @NumWeeks), calendar_date) AS ToWeekFromDate
FROM dim_date
错误被解决了


编辑:只是对这个答案进行一点扩展:问题是Reporting Services无法解析
@NumWeeks
的正确数据类型,我想可能是因为它位于
DateAdd()
函数中,并且默认为NVarchar。通过添加显式的
Convert()
将数据类型设置为Int(即使它已经是一个数字),解析器可以正确识别
@NumWeeks

的数据类型,这对于sql server 2008 management studio非常有效。您使用的是哪台sql server。我建议提供更接近实际代码的版本,而不是没有人会发现任何问题的基本版本。DATEADD()的文档(以及我使用它的经验)表明这是不准确的。这是SSIS中的一个错误-上述代码在任何版本的SQL中都不起作用@上面的代码突出显示了包含错误的代码段。你为什么希望它能起作用?
SELECT  DateAdd(wk, Convert(Int, @NumWeeks), calendar_date) AS ToWeekFromDate
FROM dim_date