T-SQL - запрос записей до и после текущего времени в одном выражении - PullRequest
1 голос
/ 02 февраля 2012

Для вас гуру T-SQL:

У меня есть следующая таблица:

ID              Arrival
1       06:16:00
2       06:17:00
3               07:19:00
4       08:21:00
5       10:22:00
6       13:21:00
7       20:22:00

Скажите, что время в настоящее время 08:00, и я хочу выбрать 2 записи до и после записи с ближайшим временем к настоящему времени. Результат должен возвращать записи с идентификаторами 2,3,4,5 и 6.

Получение записей до и после записи с ID = 4 не вызывает затруднений, но до сих пор я не могу понять, как вернуть полный набор как часть одного и того же запроса. У меня есть два выбранных утверждения:

SELECT TOP(2) * FROM Schedules 
where (datepart(hour, Arrival) - datepart(hour, getdate()))*60 + datepart(minute, Arrival) - datepart(minute, getdate())  < 0
order by (datepart(hour, Arrival) - datepart(hour, getdate()))*60 + datepart(minute, Arrival) - datepart(minute, getdate())

SELECT TOP(2) * FROM Schedules 
where (datepart(hour, Arrival) - datepart(hour, getdate()))*60 + datepart(minute, Arrival) - datepart(minute, getdate())  >= 0
order by (datepart(hour, Arrival) - datepart(hour, getdate()))*60 + datepart(minute, Arrival) - datepart(minute, getdate()) asc

, которые возвращают записи до и после. Я попытался использовать объединение в обоих операторах, но для этого необходимо удалить первый заказ по предложению, что делает недействительными мои критерии запроса.

Любые идеи помогут, спасибо.

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Мы можем использовать ROW_NUMBER для разделения, если прибытие происходит до или после, и упорядочить по абсолютной величине разницы между прибытием и временем ввода.

id          arrival          rn
----------- ---------------- --------------------
2           06:17:00.0000000 2
3           07:19:00.0000000 1
4           08:21:00.0000000 1
5           10:22:00.0000000 1
6           13:21:00.0000000 2

См. Рабочий пример по этому запросу data.se

0 голосов
/ 02 февраля 2012

Можете ли вы попробовать следующее? Я проверил, получил результат, который вы хотите

create table Arriavel (ID int, Arr_time time)

insert into Arriavel values (1, '06:16:00')
insert into Arriavel values (2, '06:17:00')
insert into Arriavel values (3, '07:19:00')
insert into Arriavel values (4, '08:21:00')
insert into Arriavel values (5, '10:22:00')
insert into Arriavel values (6, '13:21:00')
insert into Arriavel values (7, '20:22:00')


declare @cur_time time

set @cur_time = '08:00:00'

select max(arr_time) arr_time
from Arriavel
where arr_time < @cur_time

union all

select min(arr_time) arr_time
from Arriavel
where arr_time > @cur_time
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...