在Query的DATEADD函数中使用Parameters

Dam*_*ien 5 sql-server parameters dateadd

我在我的查询中尝试使用SQL 的DateAdd函数.问题是当我使用参数设置第二个争论时,数字参数我得到一个错误,这将说明如下:

无法将参数值从Decimal转换为DateTime

如果我输入无参数,即硬编码Int,它工作正常.

这有效:

SELECT     FieldOne, DateField
FROM         Table
WHERE     (DateField> DATEADD(day, -10, GETDATE()))
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

SELECT     FieldOne, DateField
FROM         Table
WHERE     (DateField> DATEADD(day, @days, GETDATE()))
Run Code Online (Sandbox Code Playgroud)

其中@days = -10

什么想法我做错了什么?顺便说一句,我在SQL Server管理器中设置此变量,因为我正在尝试解决我的DataAccess代码中的错误.不确定这是否有所作为.

谢谢

Nat*_*ths 11

我知道这是一个旧帖子,但对于有这个问题的其他人我在Reporting Services 2008 R2中遇到了类似的问题,尽管错误消息是"参数数据类型nvarchar对于dateadd函数的参数2无效".我认为这个问题可能有关系.

该问题是由Reporting Services分析SQL代码以生成报表数据集的方式引起的.就我而言,我能够更改此数据集查询:

SELECT  DateAdd(wk, @NumWeeks, calendar_date) AS ToWeekFromDate
FROM dim_date
Run Code Online (Sandbox Code Playgroud)

对此:

SELECT  DateAdd(wk, Convert(Int, @NumWeeks), calendar_date) AS ToWeekFromDate
FROM dim_date
Run Code Online (Sandbox Code Playgroud)

并且错误已解决.

编辑:只是为了扩展这个答案:问题是Reporting Services无法解析正确的数据类型@NumWeeks,我想可能是因为它在DateAdd()函数内部,并且默认为NVarchar.添加显式Convert()以将数据类型设置为Int(即使它已经是数字)使解析器能够正确识别数据类型@NumWeeks.


And*_*mar 4

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

DATEADD(day, GETDATE(), @days)
Run Code Online (Sandbox Code Playgroud)

尽管问题中的片段看起来不错。

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

  • @spikeh 上面的代码突出显示了包含错误的代码片段。你为什么期望它能起作用? (3认同)
  • DATEADD() 的文档(以及我使用它的经验)表明这是不准确的。这是 SSIS 中的一个错误 - 上面的代码在任何版本的 SQL 中都不起作用。http://technet.microsoft.com/en-us/library/ms186819.aspx (2认同)