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 デモ

Date編集: @MatBailie が正しくコメントしているように、大量のインデックス付きの日付をふるいにかける必要がある場合は、比較する前に列の値をいじりたくないので、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 に答える