tsql选择最接近的日期集

时间:2011-05-28 13:13:00

标签: sql-server 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

2 个答案:

答案 0 :(得分: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()

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