存储过程日期过滤不会返回任何记录

时间:2013-02-06 11:00:17

标签: tsql

我有以下存储过程:

ALTER PROCEDURE [dbo].[GetErrorsByDate]
(
    @p_skip INT
   ,@p_take INT
   ,@p_orderBy VARCHAR(50) = 'TimestampDesc'
   ,@p_startDate SMALLDATETIME = NULL
   ,@p_endDate SMALLDATETIME = NULL
)
AS
BEGIN

    WITH pathAuditErrorLogCT AS
    (
        SELECT
          CASE
            WHEN @p_orderBy = 'TimestampAsc' THEN ROW_NUMBER() OVER (ORDER BY E.[Timestamp])
            WHEN @p_orderBy = 'TimestampDesc' THEN ROW_NUMBER() OVER (ORDER BY E.[Timestamp] DESC)                                         
            WHEN @p_orderBy = 'LogIdAsc' THEN ROW_NUMBER() OVER (ORDER BY E.LogId)
            WHEN @p_orderBy = 'LogIdDesc' THEN ROW_NUMBER() OVER (ORDER BY E.LogId DESC)                                 
            WHEN @p_orderBy = 'ReferrerUrlAsc' THEN ROW_NUMBER() OVER (ORDER BY E.ReferrerUrl)
            WHEN @p_orderBy = 'ReferrerUrlDesc' THEN ROW_NUMBER() OVER (ORDER BY E.ReferrerUrl DESC)                                    
          END AS RowNum
          ,E.Id
        FROM pathAuditErrorLog AS E   
        WHERE
          (E.[Timestamp] >= @p_startDate OR @p_startDate IS NULL)
        AND
          (E.[Timestamp] <= @p_endDate OR @p_endDate IS NULL)                     
    )                   
    SELECT
      E.Id
     ,E.Node
     ,E.HttpCode
     ,E.[Timestamp]
     ,E.[Version]
     ,E.LogID
     ,E.IsFrontEnd
     ,E.ReferrerUrl
     ,E.[Login]
     ,E.BrowserName
     ,E.BrowserVersion
     ,E.ErrorDetails
     ,E.ServerVariables
     ,E.StackTrace
    FROM pathAuditErrorLog AS E

    INNER JOIN pathAuditErrorLogCT AS pct ON pct.Id = E.Id

    WHERE pct.RowNum BETWEEN @p_skip + 1 AND (@p_skip + @p_take)

    ORDER BY RowNum
END

这个想法是该过程从错误表返回数据,但允许动态列排序,分页和日期过滤。我的问题是日期过滤是公共表表达式的一部分。我无法解决这个问题。

如果我删除了日期过滤逻辑,那么proc工作正常。包含它,然后我经常得到没有返回行,即使有行预期。例如,如果我尝试:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-02-05'

只给出开始日期,然后我得到一堆记录。但是,如果我这样做:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-02-05', '2013-02-05'

传递开始和结束日期,我最终没有返回任何记录。这很奇怪,因为我预计第一个查询中的一些记录会出现在第二个查询中。

有人可以发现我做错了吗?

编辑: 我已经应用了AdaTheDev建议的内容,它看起来更接近我需要的东西。但是我发现了一个建议的方法没有返回我预期的情况。如果我运行以下内容:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-01-01', '2013-01-03'

我得到一行,其时间戳为2013-01-02 13:29:00。如果我运行这个:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-01-01', '2013-01-02'

我没有返回任何行。我希望看到上一个查询中的一行被返回,因为它的时间戳确实在2013年1月2日落下。我在这里误解了什么吗?

1 个答案:

答案 0 :(得分:2)

这只会返回Timestamp正好是2013-02-05(即午夜)的记录,因此不会包含当天的记录(我假设它们都有时间关联)。

如果要包含它们,我会将条款更改为:

WHERE
          (e.[Timestamp] >= @p_startDate OR @p_startDate IS NULL)
        AND
          (e.[Timestamp] < @p_endDate OR @p_endDate IS NULL) 

(更改是@p_enddate子句现在只是<

然后做:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-02-05', '2013-02-06'