首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查小时范围是否不在PostgreSQL中的‘午休’小时范围内

检查小时范围是否不在PostgreSQL中的‘午休’小时范围内
EN

Stack Overflow用户
提问于 2021-02-05 07:50:34
回答 2查看 85关注 0票数 1

我想要有空位的办公室。

举个例子,我租了一辆车,我想知道办公室在上下班时间是开着的。

我想找出在open_time之后和end_time之前开放的办公室。

办公桌;

代码语言:javascript
复制
+---+-----------+
|id |office_name|
+---+-----------+
|116|  AAAAA    |
|117|  BBBBB    |
|118|  CCCCC    |
|119|  DDDDD    |    
|120|  EEEEE    |     
|121|  FFFFF    |
|122|  GGGGG    |
+---+-----------+

工作时间表;

代码语言:javascript
复制
+----+---------+-----------+---------+----------+
|id  |office_id|day_of_week|open_time|close_time|
|1325|116      |4          |09:00:00 |12:00:00  | <- 116 has 1 break (available)
|1326|116      |4          |13:00:00 |18:00:00  |  
|1327|117      |4          |09:00:00 |18:00:00  | <- 117 has no break (available)
|1328|118      |4          |09:00:00 |12:00:00  | <- 118 has 3 break (available)
|1329|118      |4          |13:00:00 |15:00:00  | 
|1330|118      |4          |17:00:00 |20:00:00  | 
|1331|119      |4          |09:00:00 |13:30:00  | <- not available
|1332|220      |4          |15:00:00 |17:30:00  | <- not available
|1332|221      |4          |06:00:00 |17:30:00  | <- not available
|1332|222      |4          |09:00:00 |17:30:00  | <- 222 has no break (available)
+----+------------------+-----------+-----------+

当办公室有1工作时间行时,我可以访问办公室,但我无法查询办公室是否有超过1工作时间范围。

代码语言:javascript
复制
SELECT supplier_offices.id          as office_id,
       supplier_offices.supplier_id as supplier_id,
       supplier_offices.name        as supplier_office_label,
FROM "supplier_offices"
         INNER JOIN office_locations on supplier_offices.id = office_locations.supplier_office_id
         INNER JOIN supplier_office_work_hours as wh on supplier_offices.id = wh.supplier_office_id
  AND (supplier_offices.status = true)
  AND ("office_locations"."location_id" IN (3027))
  AND (wh.day_of_week = 4)
  AND (wh.open_time <= '09:01'::time)
  AND ('14:00'::time <= wh.close_time)

我得到了:

代码语言:javascript
复制
+---+-----------+
|id |office_name|
+---+-----------+
|119|  DDDDD    | <- 119 has no break    
+---+-----------+

期望值:

所有办公室均可在09:01 - 14:00之间使用

代码语言:javascript
复制
+---+-----------+
|id |office_name|
+---+-----------+
|116|  AAAAA    |
|117|  BBBBB    |
|118|  CCCCC    |
|122|  GGGGG    |
+---+-----------+
EN

回答 2

Stack Overflow用户

发布于 2021-02-05 09:07:53

您的信息有点少,但如果我理解的话,您希望这两组小时都在一行中。您可以将时间列转换为字符串,并连接打开/关闭列。然后使用STRING_AGG。

代码语言:javascript
复制
select supplier_office_id
     ,  string_agg(to_char(open_time,'hh24:mi')||'-'||to_char(close_time,'hh24:mi'), ' | ') as hours
 from office
 group by supplier_office_id;

示例Here

如果这不是您想要的,请编辑问题以提供完整的解释,并包括所需的输出。Ans全表定义(DDL)。

票数 0
EN

Stack Overflow用户

发布于 2021-02-07 01:01:00

这个问题的描述不准确,甚至不正确。

让我们假设有一个包含office_idopen_timeclose_time的表work_hours。每个office_id可能有多个非重叠的时间段。有一个给定的时间范围:从start_timeend_time。在给定start_time = 09:01的示例中,end_time = 14:00

人们可能对解决(至少)3个不同问题中的一个感兴趣:

  1. 找到一个office_id,使期间start_time - end_time完全包含在open_time - close_time期间中。
  2. 找到一个d18,使该办公室的期间d19-d20至少与一个期间重叠。等效形式:start_timeend_time中至少有一个介于open_time - close_timeoffice_id之间,使得start_timeend_time都属于此局的任何open_time - close_time周期。<代码>H234<代码>G235

问题1)和2)的解决方案是微不足道的。

原始问题表明它实际上是要解决的问题3),即使给定的“预期”表不包含给定示例数据集的正确结果(例如,丢失的office_id = 221,其从06:00到17:30不间断地打开)。

问题3)归结为:

查找所有集合,使得t1

  • finding --> t2

  • finding所有集合,使得t1 INNER JOIN t2

-->

  1. office_id open_time <= start_time <= close_time --> office_id open_time <= end_time <= close_time -->
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66055581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档