Sql server 在查询的DATEADD函数中使用参数
我试图在我的查询中使用SQL的功能。问题是,当我使用一个参数设置第二个参数时,我得到一个错误,它会说这样的话: 无法从转换参数值 日期时间的小数 而如果我输入无参数,即硬编码一个Int,它就可以正常工作 这项工作:Sql server 在查询的DATEADD函数中使用参数,sql-server,parameters,dateadd,Sql Server,Parameters,Dateadd,我试图在我的查询中使用SQL的功能。问题是,当我使用一个参数设置第二个参数时,我得到一个错误,它会说这样的话: 无法从转换参数值 日期时间的小数 而如果我输入无参数,即硬编码一个Int,它就可以正常工作 这项工作: SELECT FieldOne, DateField FROM Table WHERE (DateField> DATEADD(day, -10, GETDATE())) 但这并不是: SELECT FieldOne, DateFiel
SELECT FieldOne, DateField
FROM Table
WHERE (DateField> DATEADD(day, -10, GETDATE()))
但这并不是:
SELECT FieldOne, DateField
FROM Table
WHERE (DateField> DATEADD(day, @days, GETDATE()))
其中@days=-10
对我做错了什么有什么看法吗?顺便说一句,我在SQLServer管理器中设置了这个变量,因为我试图解决DataAccess代码中的一个错误。我不确定这是否有区别
谢谢下面的代码在这里工作得非常好(SQL Server 2005,在Management Studio中执行): 以下情况也是如此
DECLARE @days decimal
SET @days = -10
SELECT * FROM myTable WHERE myDate > DATEADD(day, @days, GETDATE())
因此,问题一定出在其他地方…听起来您将十进制数作为第三个参数而不是第二个参数传递给
DATEADD()
,例如:
DATEADD(day, GETDATE(), @days)
尽管问题中的片段看起来不错
(为了更清楚,上面的代码段是一个错误。这是从问题中生成错误的代码。)您确定错误与此语句相关吗?没有小数,如果我尝试这个方法,它仍然有效
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.
我知道这是一篇老文章,但对于其他有此问题的人,我在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
的数据类型,这对于sql server 2008 management studio非常有效。您使用的是哪台sql server。我建议提供更接近实际代码的版本,而不是没有人会发现任何问题的基本版本。DATEADD()的文档(以及我使用它的经验)表明这是不准确的。这是SSIS中的一个错误-上述代码在任何版本的SQL中都不起作用@上面的代码突出显示了包含错误的代码段。你为什么希望它能起作用?
SELECT DateAdd(wk, Convert(Int, @NumWeeks), calendar_date) AS ToWeekFromDate
FROM dim_date