【问题标题】:SQL Year Plus Parameter returns nothingSQL Year Plus 参数不返回任何内容
【发布时间】:2011-04-04 22:58:42
【问题描述】:

我从查询字符串中传递了两个变量(我验证了它们正在发送正确的值,比如说 ?mon=4&year=11)。当我尝试运行此查询时,它不返回任何结果。

@month varchar,
@year varchar

AS
Select *
From evn
Where (Month(EventDate) = Month(@month + '/1/11') AND Year(EventDate) = Year('1/1/' + @year))
Order By EventDate ASC

但如果我改变我的去向

Where (Month(EventDate) = Month(@month + '/1/11') AND Year(EventDate) = Year('1/1/11'))

它工作得很好,所以我假设我的语法不正确。正如我所说,我已经检查以确保查询字符串返回正确的值,但仍然没有。对此有什么帮助吗?我正在使用 SQL Server 2005,谢谢

【问题讨论】:

  • @year 可能设置不正确。尝试将 select 更改为 select @month, @year 并查看它返回的内容。

标签: sql sql-server-2005


【解决方案1】:

为什么您将年份和月份值放入字符串中只是为了再次尝试获取相同的值?只需将参数作为整数发送并直接使用它们:

@month int,
@year int

as

Select *
From evn
Where Month(EventDate) = @month AND Year(EventDate) = @year
Order By EventDate ASC

【讨论】:

  • 我不确定这会有多 SARGable。有谁知道这是否会产生完整的索引/表扫描? (我手头没有 SQL Server,很想知道生成的执行计划。)
  • @Dems:我首先要进行简单有效的查询,但您说得对,计算日期间隔肯定会更好。
  • 很遗憾,在布局/可读性方面我更喜欢这个。
  • 对此的有趣发现,证实了以这种方式使用 MONTH 和 YEAR 的性能损失:( blogs.lessthandot.com/index.php/DataMgmt/DataDesign/…
【解决方案2】:

您建议的方法对索引不太友好,也许使用其他方法?

以下 SQL 将有效地将日期转换为月初...
DATEADD(month, DATEDIFF(month, 0, <a date>), 0)

这样,您可以通过您感兴趣的月份,并将您的查询作为...

SELECT
  *
FROM
  evn
WHERE
    EventDate >= DATEADD(month, DATEDIFF(month, 0, @myDate),     0)
AND EventDate <  DATEADD(month, DATEDIFF(month, 0, @myDate) + 1, 0)

这避免了字符串和日期之间的隐式转换。此外,它确保不对搜索字段 (EventDate) 进行数学操作,而是只对输入参数进行一次。不操纵 EventDate 字段可以非常有效地使用任何适当的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    相关资源
    最近更新 更多