我正在尝试在查询中使用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代码中的错误。不确定这是否有所作为。
由于
答案 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.