5

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

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

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

4 回答 4

13

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

于 2012-04-29T22:45:24.503 回答
4

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

DATEADD(day, GETDATE(), @days)

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

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

于 2009-11-23T14:15:10.147 回答
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.
于 2009-11-23T15:16:09.993 回答
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())

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

于 2009-11-23T14:11:47.563 回答