У меня есть «резервирование» таблица со следующих полямиКак выбрать время, в котором доступна комната, указанная дата и номер в SQL Server?
ReservationID int
ReservationDateFrom datetime
ReservationDateTo datetime
ReservationRoom int
Я хочу создать зр, который может выбрать доступный номер и время, доступно данной дата и номер. Это то, что мне удалось сделать до сих пор, и это не сработает. Он ничего не возвращает, если на заданную дату нет расписания номеров, и он возвращает только доступные расписания комнат между 2 датами.
CREATE PROCEDURE [dbo].[sp_GetAvailableSchedules](
@date date,
@room int
)
AS
BEGIN
select ReservationID, ReservationDateFrom, ReservationDateTo, ReservationRoom
from Reservation r
where ReservationRoom = @room and @date = CONVERT(date, ReservationDateFrom)
union all
select NULL, ReservationDateTo,
lead(ReservationDateFrom) over (partition by ReservationRoom order by ReservationDateFrom),
ReservationRoom
from reservation r
where ReservationRoom = @room and @date = CONVERT(date, ReservationDateFrom)
END
Образец данных:
ReservationID ReservationDateFrom ReservationDateTo ReservationRoom
1 2017-01-02 00:00:00.000 2017-01-02 02:00:00.000 14
2 2017-01-02 04:00:00.000 2017-01-02 05:00:00.000 14
3 2017-01-02 06:00:00.000 2017-01-02 08:00:00.000 14
4 2017-01-02 08:30:00.000 2017-01-02 09:30:00.000 14
5 2017-01-02 09:50:00.000 2017-01-02 11:00:00.000 14
6 2017-01-02 13:00:00.000 2017-01-02 15:00:00.000 14
Ожидаемые результаты при выполнении
EXEC sp_GetAvailableSchedules '2017-01-02', 14
TimeIn TimeOut Minutes
02:00 04:00 120
05:00 06:00 60
08:00 08:30 30
09:30 09:50 20
11:00 13:00 120
15:00 24:00 540
Решения для SQL Server 2012 ниже будет делать, но было бы лучше, если она будет работать на по крайней мере SQL Server 2008 .
Прогресс обновления съела
Я попытался интегрировать @ zerox981 в ответ на мой зр как так
create PROCEDURE [dbo].[sp_GetAvailableSchedules](
@date datetime,
@room int
)
AS
BEGIN
with data as
(
SELECT *,
ISNULL(
(select top 1 ReservationDateFrom from Reservation where ReservationRoom =a.ReservationRoom and ReservationDateFrom> a.ReservationDateTo order by ReservationDateFrom)
, @date+1) as next
from Reservation a
where ReservationRoom = @room
)
select
cast(Reservationdateto as time) TimeIn,
cast(next as time) [TimeOut],
datediff(mi,ReservationDateTo, next) [Minutes]
from data
END
я нашел много проблем с этим, если это мой вставленные данные
select * from Reservation
ReservationID ReservationDateFrom ReservationDateTo ReservationRoom
34 2017-02-17 13:00:00.000 2017-02-17 15:00:00.000 6003
35 2017-02-17 09:00:00.000 2017-02-17 12:00:00.000 6003
36 2017-02-18 12:00:00.000 2017-02-18 14:00:00.000 6003
Case 1 - При наличии большого количества резерваций в день и номер
declare @date datetime = '2017-02-17 00:00:00.000' , @room int = 6003
exec [sp_GetAvailableSchedules] @date, @room
Ожидаемый результат
TimeIn TimeOut Minutes
00:00 09:00 540
12:00 13:00 60
15:00 24:00 540
Фактические результаты
TimeIn TimeOut Minutes
15:00:00.0000000 12:00:00.0000000 1260
12:00:00.0000000 13:00:00.0000000 60
14:00:00.0000000 00:00:00.0000000 -840
Случай 2 - Когда есть 1 резервирование в дате и номере
declare @date datetime = '2017-02-18 00:00:00.000' , @room int = 6003
exec [sp_GetAvailableSchedules] @date, @room
Ожидаемые результаты
TimeIn TimeOut Minutes
00:00 12:00 720
14:00 24:00 600
Фактические результаты
TimeIn TimeOut Minutes
15:00:00.0000000 12:00:00.0000000 1260
12:00:00.0000000 13:00:00.0000000 60
14:00:00.0000000 00:00:00.0000000 600
Case 3 - Если ни одна оговорка не в указанной даты и номера (весь день должен быть доступен)
declare @date datetime = '2017-02-20 00:00:00.000' , @room int = 500
exec [sp_GetAvailableSchedules] @date, @room
Ожидаемые результаты (целый день доступны)
TimeIn TimeOut Minutes
00:00 24:00 1440
Фактический результат пуста
ли ваши выборочные данные правильно, особенно для 5 и 6 ReservationID? –
Что-то не так? 5 - с 9:50 до 11:00 и 6 - с 13:00 -3: 00pm –
Строка 6 выглядит так, как должна была к 2017-01-03 вместо 2017-01-02 для FromDate. – Jerrad