【问题标题】:Check if hour range is not in 'lunch break' hour range in PostgreSQL检查时间范围是否不在 PostgreSQL 的“午休”时间范围内
【发布时间】:2021-05-09 08:11:11
【问题描述】:

我想找个有空的办公室。

例如,我租了一辆车,我想知道办公室在接送时间开放。

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

办公桌;

+---+-----------+
|id |office_name|
+---+-----------+
|116|  AAAAA    |
|117|  BBBBB    |
|118|  CCCCC    |
|119|  DDDDD    |    
|120|  EEEEE    |     
|121|  FFFFF    |
|122|  GGGGG    |
+---+-----------+

工作时间表;

+----+---------+-----------+---------+----------+
|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 workhour 行时,我可以去办公室,但我无法查询 如果办公室的工作时间范围超过1

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)

我明白了:

+---+-----------+
|id |office_name|
+---+-----------+
|119|  DDDDD    | <- 119 has no break    
+---+-----------+

预期:

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

+---+-----------+
|id |office_name|
+---+-----------+
|116|  AAAAA    |
|117|  BBBBB    |
|118|  CCCCC    |
|122|  GGGGG    |
+---+-----------+

【问题讨论】:

  • 您有一张表的样本数据,但您的查询引用了两张。
  • @GordonLinoff 我添加了有关我的问题的更多信息。

标签: sql postgresql datetime join time


【解决方案1】:

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

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)。

【讨论】:

  • 这不是我想要的,但还是谢谢你!我添加了有关我的问题的更多信息。我想在给定的时间范围内找到可用的办公室。
【解决方案2】:

问题描述不准确甚至不正确。

假设有一个表work_hoursoffice_idopen_timeclose_time。每个office_id 可能有多个不重叠的时段。有一个给定的时间范围:从start_timeend_time。在给定的示例中,start_time = 09:01end_time = 14:00

人们可能有兴趣解决(至少)3 个不同问题之一:

  1. 找到一个office_id,使得start_time - end_time 完全包含在open_time - close_time 期间。
  2. 找到一个office_id,使得start_time - end_time 与该办公室的至少一个open_time - close_time 期间重叠。等效形式:start_timeend_time 中的至少一个在 open_time - close_time 句点之一之间。
  3. 找到一个office_id,使start_timeend_time 都属于此办公室的open_time - close_time 期间。

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

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

问题 3) 归结为:

  1. 找到所有office_id 使得open_time &lt;= start_time &lt;= close_time --> t1
  2. 找到所有office_id 使得open_time &lt;= end_time &lt;= close_time --> t2
  3. 找到上述集合的交集 --> t1 INNER JOIN t2

【讨论】:

  • 感谢您的回答。您提到office_id = 221 应该包含在Expected 表中。 office_id = 22106:00 打开比给定的open_time 早一点,即09:01。当您前往06:00 的商店时,该商店将不营业。想象一下,您想租车,09:01-17:30 是您的接送时间。您无法通过06:00 到达那里。办公室不会开放。我想找到在open_time 之后和end_time 之前开放的办公室。
  • 现在,我对您的问题陈述感到有些困惑。
猜你喜欢
  • 1970-01-01
  • 2016-05-03
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
相关资源
最近更新 更多