0

我有一个名为 source_name 的表,其填充数据如下所示。

Date          Name
------        -------
2010-01-14    a
2010-01-15    b
2010-01-16    c
2010-01-17    bc
2010-01-18    bcc
2010-01-19    bd
2010-01-20    bddd
2010-01-13    be
2010-01-12    beeeee
2010-01-11    beee
2010-01-10    beee
2010-01-09    beee

我需要一个 CTE 查询来返回以下结果。这是我的条件。如果我选择 @no_of_days = 2 和 @date = '2010-01-14' 它必须返回我

2010-01-15    b
2010-01-16    c
2010-01-13    be
2010-01-12    beee

我的意思是,如果@no_of_days 被选为任何数字,那么我希望过滤数据与从给定日期到该递增日期直到给定 no_of_days 以及相应的低于它的日期的数据数量完全相同。另一个例子,如果 @no_of_days = 3 和 @date = '2010-01-14'

2010-01-15    b
2010-01-16    c
2010-01-17    bc
2010-01-13    be
2010-01-12    beee
2010-01-11    beee

我需要帮助。

4

2 回答 2

2

我认为您不需要 CTE,我也看不出它有什么帮助。但是该DATEDIFF函数应该允许您很容易地编写 where 子句:

SELECT *
FROM source_name
WHERE ABS(DATEDIFF( day, [Date], @Date )) BETWEEN 1 AND @no_of_days

SQLFiddle 演示

编辑:正如@MatBailie 正确评论的那样,如果您需要筛选大量索引日期,您不想Date在比较之前干预该列的值,DATEADD而是您的朋友。

于 2013-10-22T22:58:10.583 回答
2
;
WITH myTable([Date], [Name]) 
AS (
    SELECT *
    FROM source_name
    WHERE [Date] BETWEEN DATEADD(day, (@no_of_days*-1), @date) AND DATEADD(day, @no_of_days, @date)
    AND [Date] != @Date

)
.... do something here.
于 2013-10-22T22:58:14.113 回答