【问题标题】:Stored Procedure Help: Passing a Year as a parameter to get results存储过程帮助:将年份作为参数传递以获取结果
【发布时间】:2013-07-15 05:51:21
【问题描述】:

我试图基本上输入一年(而不是整个日期)来获取一组结果,这些结果将告诉我今年售出的商品数量。但是,我不确定如何去做。下面是我的一个例子。

ALTER PROC OrderYear
(@OrderYear datetime)
AS

SELECT Orderdate as [Year],COUNT(SalesOrderID) as Count
FROM Sales.SalesOrderHeader
WHERE @OrderYear=YEAR(OrderDate)
GROUP BY OrderDate

BEGIN
SET NOCOUNT ON
END

EXEC OrderYear '2005'

【问题讨论】:

    标签: sql-server sql-server-2008-r2 stored-procedures parameters datetime


    【解决方案1】:

    您想将查询谓词表示为范围,因为范围是可搜索的:

    SELECT Orderdate as [Year],COUNT(SalesOrderID) as Count
    FROM Sales.SalesOrderHeader
    WHERE OrderDate >= @firstDayOfYear AND OrderDate <= @lastDayOfYear
    GROUP BY OrderDate;
    

    所以诀窍是计算给定年份的@firstDayOfYear@lastDayOfYear。我将把它作为练习留给读者。

    【讨论】:

    • OrderDate &lt; @firstDayOfNextYear 也可以使用日期时间。
    • @ypercube 我认为如果它有一个GROUP BY OrderDate 它可能没有时间组件,但你是对的,使用&lt; 将适用于date datetime
    【解决方案2】:

    程序没问题,改变输入参数的类型:

    ALTER PROC OrderYear
    (@OrderYear int) 
    AS
    SELECT Orderdate as [Year],COUNT(SalesOrderID) as Count
    FROM Sales.SalesOrderHeader
    WHERE @OrderYear=YEAR(OrderDate)
    GROUP BY OrderDate
    

    【讨论】:

    • 它可能有效,但效率不高。将函数应用于列(通常)会使条件不可预测。
    • 但您确定 OrderDate 存在于索引中吗?如果不是,最后一个查询会更快。
    • 即使没有索引,为什么会更快? YEAR() 函数必须被调用的次数与表中的行数一样多。有了 Remus 的回答,根本没有函数调用(好吧,也许一次来计算 @firstDayOfYear 和 @lastDayOfYear。)
    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2012-12-15
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多