Один из методов:
SELECT TOP 1 s.*
FROM studies s
ORDER BY ABS(DATEDIFF(day, s.studydate, @givendate));
Для получения ближайшей даты используется DATEDIFF()
.Обратите внимание, что для разницы используется day
.Если ваши «даты» содержат компонент времени, вам может потребоваться другая часть даты.
Обратите внимание, что это не будет использовать индексы.Более быстрый метод (если у вас есть индексы) немного сложнее:
SELECT TOP (1) s.*
FROM ((SELECT TOP 1 s.*
FROM studies s
WHERE s.studydate <= @givendate
ORDER BY s.studydate DESC
) UNION ALL
(SELECT TOP 1 s.*
FROM studies s
WHERE s.studydate > @givendate
ORDER BY s.studydate ASC
)
) s
ORDER BY DATEDIFF(day, s.studydate, @givendate));
Хотя это и более сложно, каждый подзапрос может использовать индекс для studydate
.Окончательная сортировка будет иметь только две строки, поэтому она должна быть очень быстрой.