【发布时间】:2017-02-16 18:37:59
【问题描述】:
我有包含以下字段的“预订”表
ReservationID int
ReservationDateFrom datetime
ReservationDateTo datetime
ReservationRoom int
我想创建一个可以选择可用房间以及给定日期和房间的可用时间的 sp。这是我到目前为止所做的事情,但它不起作用。如果给定日期没有房间时间表,它不会返回任何内容,并且只返回 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 的答案集成到我的 sp 中
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
案例 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
案例 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 是下午 1:00 -3:00
-
第 6 行看起来应该是 2017-01-03 而不是 2017-01-02 的 FromDate。
-
那是一个错字。 Tnx 指出这一点。
标签: sql sql-server sql-server-2008 tsql sql-server-2012