Используйте datediff()
, чтобы получить продолжительность между двумя датами.Поскольку вам все равно, будет ли дата в будущем или в прошлом, используйте abs()
, чтобы получить абсолютное значение продолжительности.Затем упорядочите по абсолютной продолжительности и возьмите верхнюю запись.
Я не уверен, действительно ли вы используете MySQL или SQL Server.TOP (1)
обозначает SQL Server, тег - MySQL.
Вот версия MySQL:
SELECT p.firstname,
p.lastname,
e.birthdate,
e.jobtitle
FROM humanresources.employee e
INNER JOIN person.person p
ON p.businessentityid = e.businessentityid
ORDER BY abs(datediff(e.birthdate, @date))
LIMIT 1;
А вот для SQL Server:
SELECT TOP (1)
p.firstname,
p.lastname,
e.birthdate,
e.jobtitle
FROM humanresources.employee e
INNER JOIN person.person p
ON p.businessentityid = e.businessentityid
ORDER BY abs(datediff(day, e.birthdate, @date));
Может понадобитьсянекоторые изменения в зависимости от используемых вами типов данных.
Редактировать:
Решение проблемы с fifoniks, которая может работать лучше, если существуют соответствующие индексы (на humanresources.employee.birthdate
оптимально один раз по возрастанию и один раз по убыванию).
Сначала он получает объединение ближайшей записи в будущем @date
(включая @date
) и аналоговой записи в прошлом, возможно, используя индексы вдольпуть.Из этих двух записей выбирается та, которая имеет самую низкую абсолютную продолжительность до @date
.Затем person
присоединяется.
SELECT p.firstname,
p.lastname,
y.bithdate,
y.jobtitle
FROM (SELECT TOP (1)
x.businessentityid,
x.birthdate,
x.jobtitle
FROM (SELECT TOP (1)
e.businessentityid,
e.birthdate,
e.jobtitle
FROM humanresources.employee e
WHERE e.birthdate >= @date
ORDER BY e.birthdate ASC
UNION ALL
SELECT TOP (1)
e.businessentityid,
e.birthdate,
e.jobtitle
FROM humanresources.employee e
WHERE e.birthdate <= @date
ORDER BY e.birthdate DESC) x
ORDER BY abs(datediff(day, x.birthdate, @date)) ASC) y
INNER JOIN person.person p
ON p.businessentityid = y.businessentityid;