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

Posted

技术标签:

【中文标题】SQL 提取一天中所有未保留的 30 分钟或 60 分钟时间段【英文标题】:SQL to Extract all 30 minute or 60 minute time periods in a day that aren't reserved 【发布时间】:2014-09-05 14:37:31 【问题描述】:

我有一个预订表,其中包含给定日期的可变时间范围。它们是 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 AM - 4:30 PM)之间的所有可用房间。

【问题讨论】:

您需要从一个包含所有可用时隙的表开始。然后你对你的预订进行左连接。 预订是否总是在 30 分钟以内,或者您可以在 9:13 - 9:43 之间进行预订吗? 我会说,一般来说,它们落在一个小时和一个半小时的时间。它们可能会四分五裂,尽管这种情况很少见。 【参考方案1】:

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

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

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

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

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; 

【讨论】:

没错。最初的问题没有说明版本,所以我没有理由不使用当前版本,即 SQL Server 2012。

以上是关于SQL 提取一天中所有未保留的 30 分钟或 60 分钟时间段的主要内容,如果未能解决你的问题,请参考以下文章

Python - 为一天中的时间生成字符串[重复]

Arduino UDPNTP Epoch,确定一天中的分钟

pandas groupby 一天中的时间,带 15 分钟的垃圾箱

在 pandas 中以更快的方式分组一天中的时间

怎样用sql查询一段时间内一天中的空闲时间和工作时间

提取关于0值的时间,求一天中的多个工作时间,在MongoDB数组操作中