2013-10-22 88 views
0

我有一個名爲source_name的表,其填充數據如下給出。使用CTE,我需要過濾掉數據

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
; 
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. 
+0

+1用於管理將其變爲CTE – flup

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是您的朋友。

+0

1爲全力以赴並添加小提琴.. – NotMe

+0

@ChrisLively * *輕笑 – flup

+1

即使有上'[日期]'的指標,已經參考其內部兩個函數*('DateDiff的,和ABS')*意味着索引不能使用,整個表格將被掃描。我強烈建議***永遠不要把搜索字段放在函數中。 DATEADD(DAY, - @ no_of_days,@date)和DATEADD(DAY,@no_of_days,@date)之間的[DATE]'沒有這個問題*(因爲它現在在索引列上執行範圍查找,在兩個標量之間常量)*。 – MatBailie