SQL以提取一天中未保留的所有30分钟或60分钟的时间段

时间:2014-09-05 14:37:32

标签: sql sql-server

我有一个预订表,其中包含给定日期的可变时间范围。它们是30分钟,60分钟,用户输入的任何给定分钟范围的预留时间段。

我想要做的是创建一个SQL语句,它可以为我提供给定日期内所有未被保留的时间段。用户可以指定分钟范围(30分钟,60分钟,90分钟)。我从哪里开始?

保留表是基本的:

ROOM, RESERVED_DATE, FROM_TIME, TO_TIME
A     09/02/2014     9:00 AM    10:00 AM
B     09/02/2014     11:00 AM   12:00 PM
C     09/02/2014     1:30 PM    2:00 PM

我会允许用户说他们想要在特定增量(30分钟,60分钟,90分钟)内的营业时间(上午8:00 - 下午4:30)之间的所有可用房间。

1 个答案:

答案 0 :(得分:0)

这是我采取的方法。这将获取@minimum_interval并找到大于该值的间隔。如上所述,它不包括之前和之后。您可以通过在表中插入虚拟日期作为开始日期/时间和结束日期/时间来解决这个问题,或者在cte(首选)中将其构建为联合。

基本上所有它正在做的是按开始时间排序在[to]列和[next]列上做一个日期值,其中[next]用lag函数计算。这使你不必拥有一个专用的表,这也是我在cte中建立一个虚拟的开始和结束会议的原因;由于数据未存储,因此无需更新。您可以在元数据结构中存储开始和结束时间,以允许不同房间的不同“开放”时段。

此外,您可以将PARTITION子句添加到滞后函数,以允许它在不指定空间的情况下工作。

这是一个有趣的练习,谢谢你提出这个问题!

declare @date [datetime] = cast(current_timestamp as [date]);
declare @minimum_interval [int] = 15
    , @room           [sysname] = N'A';
declare @reservation table (
[room]   [sysname]
, [from] [datetime]
, [to]   [datetime]);
insert into @reservation
        ([room],[from],[to])
values      (N'A',N'20140902 09:00',N'20140902 10:00'),
        (N'A',N'20140902 10:00',N'20140902 11:00'),
        (N'A',N'20140902 13:00',N'20140902 14:00');
with [builder]
 as (select [room]
            , [from]
            , [to]
            , lag ([from]
                   , 1
                   , 0)
                over (
                  order by [from] desc) as [next]
     from   @reservation
     where  [room] = @room)
select [room]
   , [from]
   , [to]
   , [next]
from   [builder]
where  datediff(minute
            , [to]
            , [next]) > @minimum_interval;