在Query的DATEADD函数中使用Parameters

问题描述 投票:3回答:4

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

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

如果我输入无参数,即硬编码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代码中的错误。不确定这是否有所作为。

谢谢

sql-server parameters dateadd
4个回答
3
投票

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

DATEADD(day, GETDATE(), @days)

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

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


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的数据类型。


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())

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


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.
© www.soinside.com 2019 - 2024. All rights reserved.