Сервер SQL: Получить запись с датой, ближайшей к данной дате - PullRequest
0 голосов
/ 17 октября 2018

У меня есть таблица dbo.studies с datetime column studydate

Я хочу запросить базу данных, используя переменную datetime givendate, чтобы найти запись, ближайшую к datetime in column studydate

Использование:

SELECT TOP 1 *
FROM studies
WHERE studies.studydate < givendate
ORDER BY studies.studydate DESC

Результатом будет запись, которая на меньше и ближайшая к givendate, но мне нужна запись , ближайшая к givendate, независимо от того, меньше оно или больше затем studydate

Есть мысли о том, как его найти?

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

используйте функцию datediff, чтобы она всегда возвращала 1

SELECT TOP 1 *
FROM studies    
ORDER BY  DATEDIFF(dd,studies.studydate, givendate) ASC
.
0 голосов
/ 17 октября 2018
SELECT TOP 1 *
FROM studies
ORDER BY ABS(DATEDIFF(second, @givendate, studies.studydate))
0 голосов
/ 17 октября 2018

Один из методов:

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.Окончательная сортировка будет иметь только две строки, поэтому она должна быть очень быстрой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...