在Query的DATEADD函数中使用Parameters

时间:2009-11-23 14:07:50

标签: sql-server parameters dateadd

我正在尝试在查询中使用SQL的DateAdd函数。问题是,当我使用参数来设置第二个争论时, number 参数我得到一个错误,会出现这样的错误:

  

无法转换参数值   十进制到日期时间

如果我输入无参数,即硬编码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

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

由于

4 个答案:

答案 0 :(得分:10)

我知道这是一篇旧帖子,但对于遇到此问题的其他人,我在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的数据类型。

答案 1 :(得分:3)

听起来你将小数作为第3个而不是第2个参数传递给DATEADD(),如:

DATEADD(day, GETDATE(), @days)

虽然问题中的片段看起来不错。

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

答案 2 :(得分:0)

以下代码在这里运行得很好(SQL Server 2005,在Management Studio中执行):

DECLARE @days decimal
SET @days = -10

SELECT DATEADD(day, @days, GETDATE())

以下

DECLARE @days decimal
SET @days = -10

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

所以,问题必定在其他地方......

答案 3 :(得分:0)

您确定错误与此声明有关吗?没有涉及小数,如果我尝试这个仍然有效

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.