【问题标题】:Using Parameters in DATEADD function of a Query在查询的 DATEADD 函数中使用参数
【发布时间】:2009-11-23 14:07:50
【问题描述】:

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

谢谢

【问题讨论】:

  • 适用于 sql server 2008 管理工作室。您使用的是哪个 sql server。
  • 我建议让我们更接近实际代码,而不是这个没人能发现任何问题的基本版本。

标签: sql-server parameters dateadd


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    DATEADD(day, GETDATE(), @days)
    

    虽然问题中的 sn-p 看起来不错。

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

    【讨论】:

    • DATEADD() 的文档(以及我使用它的经验)表明这是不准确的。这是 SSIS 中的一个错误——上面的代码在任何版本的 SQL 中都不起作用。 technet.microsoft.com/en-us/library/ms186819.aspx
    • @spikeh 上面的代码突出显示了包含错误的 sn-p。您为什么希望它起作用?
    【解决方案3】:

    以下代码在这里运行良好(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())
    

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

    【讨论】:

      【解决方案4】:

      您确定错误与此语句有关吗?不涉及小数,如果我尝试它仍然有效

      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.
      

      【讨论】:

        猜你喜欢
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2022-01-23
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多