当前位置: 首页 > 面试题库 >

如何在PostgreSQL的预订表中找到第一次空闲时间

程鸿波
2023-03-14
问题内容

预订表包含预订的开始日期,开始时间和持续时间。开始时间是工作日8:00 .. 18:00的半小时增量。持续时间每天也以半小时为增量。

CREATE TABLE reservation (
  startdate date not null,  -- start date
  starthour numeric(4,1) not null , -- start hour 8 8.5 9 9.5  ..  16.5 17 17.5
  duration  Numeric(3,1) not null, -- duration by hours 0.5 1 1.5 .. 9 9.5 10
  primary key (startdate, starthour)
);

如果需要,表结构可以更改。

如何在未保留的表中查找第一个免费的半小时?如果表包含

startdate   starthour  duration 
14          9           1              -- ends at 9:59
14          10          1.5            -- ends at 11:29, e.q there is 30 minute gap before next
14          12          2
14          16          2.5

结果应该是:

starthour  duration
11.5       0.5

可能应该使用PostgreSql 9.2窗口函数来查找starthour大于上一行starthour + duration的第一行。
如何编写返回此信息的select语句?


问题答案:

Postgres 9.2具有范围类型,我建议使用它们。

create table reservation (reservation tsrange);
insert into reservation values 
('[2012-11-14 09:00:00,2012-11-14 10:00:00)'), 
('[2012-11-14 10:00:00,2012-11-14 11:30:00)'), 
('[2012-11-14 12:00:00,2012-11-14 14:00:00)'), 
('[2012-11-14 16:00:00,2012-11-14 18:30:00)');

ALTER TABLE reservation ADD EXCLUDE USING gist (reservation WITH &&);

“ EXCLUDE USING gist”创建不允许插入重叠条目的索引。您可以使用以下查询找到差距(vyegorov查询的变体):

with gaps as (
  select 
    upper(reservation) as start, 
    lead(lower(reservation),1,upper(reservation)) over (ORDER BY reservation) - upper(reservation) as gap 
  from (
    select * 
    from reservation 
    union all values 
      ('[2012-11-14 00:00:00, 2012-11-14 08:00:00)'::tsrange), 
      ('[2012-11-14 18:00:00, 2012-11-15 00:00:00)'::tsrange)
  ) as x
) 
select * from gaps where gap > '0'::interval;

“统一所有值”掩盖了非工作时间,因此您只能在上午8点至晚上18点之间进行预订。

结果如下:

        start        |   gap    
---------------------+----------
 2012-11-14 08:00:00 | 01:00:00
 2012-11-14 11:30:00 | 00:30:00
 2012-11-14 14:00:00 | 02:00:00

文档链接:-http:
//www.postgresql.org/docs/9.2/static/rangetypes.html
“范围类型” -https://wiki.postgresql.org/images/7/73/Range-types-pgopen-
2012.pdf



 类似资料:
  • 问题内容: 在有关搜索日期范围的问题中,我尝试简化问题,并无意间提出了另一个更简单的问题。 而不是通过编辑使该问题复杂化,我将要问的是我实际想要的问题。 我有两个表Property和Booking。预订具有属性的外键以及开始和结束日期。 用户正在搜索空闲时段,并以天为单位提供所需的持续时间。他们还提供了他们感兴趣的开始日期范围。因此,搜索将遵循以下路线:“找到我想要的3天时段(可在5月的任何时间开

  • 我使用java servlets和pgadmin9.1。问题是servlets中的连接没有正确关闭,所以如果它达到最大连接就会导致空白屏幕。我不希望每个用户都在pgadmin中扩展最大连接...我在servlet的开始和结束点使用了下面的查询,但它显示的错误是..由于管理员命令连接终止..

  • 问题内容: 我刚安装了postgresql,并在安装过程中指定了密码x。当我尝试执行并指定任何密码时,我收到以下消息: createdb:无法连接到数据库postgres:严重:用户的密码身份验证失败 相同。 我应该如何开始?我可以将自己添加为数据库用户吗? 问题答案: 其他答案对我来说并不完全令人满意。这是在Xubuntu 12.04.1 LTS上用于postgresql-9.1的工具。 使用用

  • 我们正在spring boot(带有嵌入式tomcat)和spring Cloud上运行微服务。这意味着服务发现,定期的健康检查和响应这些健康检查的服务,……我们还有spring boot admin server用于监控,我们可以看到所有服务都运行正常。目前仅在测试环境中运行... 我们的一些微服务很少被调用(假设每两天调用一次),但是仍然有定期的健康检查。当这些服务的REST api在如此长的

  • 问题内容: 是否可以防止删除PostgreSQL端表中的第一行? 我有一个类别表,我想防止删除默认类别,因为它可能会破坏应用程序。当然,我可以轻松地在应用程序代码中执行此操作,但是在数据库中执行此操作会更好。 我认为这与delete语句的规则有关,但是我找不到文档中与我的问题遥遥相望的任何东西。 问题答案: 我看到的最好的方法是在此表上创建一个删除触发器。基本上,您必须编写一个存储过程来确保该“默

  • 问题内容: 我将CloudFlare用于我的一个高流量网站,它位于堆栈的前面。 关键是CloudFlare除了创建新的连接之外,还保留空闲连接,这不是我可以更改的设置。 当我让Varnish或Nginx坐在前面监听端口80时,它们具有开箱即用的配置来挂断空闲连接。 很好,直到我必须将用Go编写的代理添加到堆栈的最前面。它使用标准库。 我不是Go向导,而是根据人们告诉我的内容,只有读写超时设置,而不