使用CTE,我需要过滤掉数据

时间:2013-10-22 22:51:30

标签: sql sql-server sql-server-2008

我有一个名为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

我需要帮助。

2 个答案:

答案 0 :(得分:2)

我认为你不需要CTE,也不知道它是如何帮助的。 但是DATEDIFF函数应该允许你很容易地写一个where子句:

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

SQLFiddle demo

编辑:正如@MatBailie正确评论的那样,如果你需要筛选大量的索引日期,你不希望在比较Date列之前插入DATEADD列的值。{{1是你的朋友。

答案 1 :(得分: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.