0

我需要对这个 sp 进行调整:

alter PROCEDURE Gaming.usp_DB_GetGameResultsByDateTime 
(@FromDateTime AS DATETIME2(7) = null ,
 @ToDateTime AS DATETIME2(7)   = null)
AS
   DECLARE @FromDateTime_Actual AS DATETIME2(7) , 
           @ToDateTime_Actual AS DATETIME2(7); 
   SET @FromDateTime_Actual = ISNULL(@FromDateTime, DATEADD (DAY, -1, SYSDATETIME()));
   SET @ToDateTime_Actual = ISNULL (@ToDateTime , SYSDATETIME ());

   SELECT  Id, GameTypeId, PlayerId,
           BetAmount, Profit, 
           DateAndTime
   FROM Gaming.GameResults
   WHERE DateAndTime >= @FromDateTime_Actual
     AND DateAndTime < @ToDateTime_Actual
   ORDER BY DateAndTime ASC;
GO

这个存储过程有什么问题?你将如何重写这个存储过程?

4

3 回答 3

2

这个存储过程没有任何问题。

您可以通过摆脱变量使其更具可读性:

ALTER PROCEDURE
        Gaming.usp_DB_GetGameResultsByDateTime
        (
        @FromDateTime AS DATETIME2(7) = NULL ,
        @ToDateTime AS DATETIME2(7) = NULL
        )
AS
DECLARE
        SELECT  Id, GameTypeId, PlayerId, BetAmount, Profit, DateAndTime
        FROM    Gaming.GameResults
        WHERE   DateAndTime >= ISNULL (@FromDateTime , DATEADD (DAY , -1 , SYSDATETIME ()))
                AND DateAndTime < ISNULL (@ToDateTime , SYSDATETIME ())
        ORDER BY
                DateAndTime ASC
GO

通过创建索引来提高效率GameResults (DateAndTime)

于 2011-01-11T18:08:30.247 回答
0

根据您提供的内容,过程相当简单。如果您有性能问题,请确保您有一个索引,DateAndTime因为您的所有过滤都在该字段上。

于 2011-01-11T18:06:47.120 回答
0

对我来说看起来不错,但我可能会这样做

WHERE DateAndTime between @FromDateTime_Actual AND @ToDateTime_Actual

但我不认为它会影响性能

如果您希望提高性能,您可能应该考虑查看索引,例如 DateAndTime 可能是一个不错的起点。

之后,您需要查看类似这样的性能提示文章

正如 Quassnoi 所指出BETWEEN的,包含将 <@FromDateTime_Actual 更改为 <= @FromDateTime_Actual。如果您真的希望它不具有包容性并且您希望BETWEEN您可以修改设置 @ToDateTime_Actual 的方式以实现这一点。

于 2011-01-11T18:08:15.533 回答