2011-05-28 36 views
1

我想選擇一組日期最接近(包括前,後)的具體日期。TSQL選擇最接近的日期設置

我很接近,所有我想現在要做的就是選擇頂部10「貼近」爲0 ...但我不知道該怎麼做。

BEGIN 
Declare @DateCenter datetime2 = '2011-03-30 00:15:00' 
Declare @DateStart datetime2 = DATEADD(day,-7,@DateCenter) 
Declare @DateEnd datetime2 = DATEADD(day,7,@DateCenter) 
SELECT TOP 30 *, DateDiff(hour, Utc, @DateCenter) as Closeness 
FROM [CheckIns] 
WHERE Utc BETWEEN @DateStart AND @DateEnd 
END 
+0

莫非你'ORDER BY'接近值? – marnir 2011-05-28 13:15:45

+0

親密度值是正值和負值。我想要的是最接近0的數字...所以如果這些值是(-3,-1,1,2,4,5),我想要它的前4產品(-3,-1,1, 2) – 2011-05-28 13:41:25

回答

2

10或30,你是敘述和代碼示例不匹配。總之,下面應該工作:

select top 10 * 
from (
    select *,ROW_NUMBER() OVER (ORDER BY ABS(DATEDIFF(minute,Utc,@DateCenter))) as rn 
    from CheckIns 
) t 
order by rn 

這並不那些之前和之後的那些區別 - 它只是尋求最接近10。如果你想,說,那之前的日期10,並且成功它10,那麼你需要2級排序,或者可能是一個PARTITION BY條款也給ROW_NUMBER窗口功能。

如果你想包含並列結果,你需要切換到使用RANK()DENSE_RANK()而不是ROW_NUMBER()

+0

30沒有選擇最接近的30.它是一個用於減少集合的過濾器。這是不正確的......我認爲是一個內部查詢的查詢。 – 2011-05-28 13:45:49

+0

@Jonathon - 希望你可以看到,雖然,這關鍵是要使用窗口功能,通過'ABS(DATEDIFF(訂貨...'使得下號被指定給那些迄今爲止最接近提供的日期 – 2011-05-28 13:48:36

+0

總之,您的查詢看起來十分感謝 – 2011-05-28 13:51:32

0

我認爲這將使用(如果有的話)上Utc指數:

SELECT TOP 10 
    * 
FROM 
( SELECT TOP 10 
     * 
     , DateDiff(hour, Utc, @DateCenter) as Closeness 
    FROM [CheckIns] 
    WHERE Utc >= @DateCenter 
    ORDER BY Utc 
UNION ALL 
    SELECT TOP 10 
     * 
     , DateDiff(hour, @DateCenter, Utc) as Closeness 
    FROM [CheckIns] 
    WHERE Utc < @DateCenter 
    ORDER BY Utc DESC 
) AS temp 
ORDER BY Closeness