tsql выберите ближайшую дату - PullRequest
1 голос
/ 28 мая 2011

Я пытаюсь выбрать набор дат, который ближе всего (включая до и после) к определенной дате.

Я довольно близок, все, что я хочу сейчас сделать, - это выбрать 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 ]

2 голосов
/ 28 мая 2011

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 голосов
/ 28 мая 2011

Я думаю, что это будет использовать (если есть) индекс на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...