我想要有空位的办公室。
举个例子,我租了一辆车,我想知道办公室在上下班时间是开着的。
我想找出在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工作时间行时,我可以访问办公室,但我无法查询办公室是否有超过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 |
+---+-----------+发布于 2021-02-05 09:07:53
您的信息有点少,但如果我理解的话,您希望这两组小时都在一行中。您可以将时间列转换为字符串,并连接打开/关闭列。然后使用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)。
发布于 2021-02-07 01:01:00
这个问题的描述不准确,甚至不正确。
让我们假设有一个包含office_id、open_time、close_time的表work_hours。每个office_id可能有多个非重叠的时间段。有一个给定的时间范围:从start_time到end_time。在给定start_time = 09:01的示例中,end_time = 14:00。
人们可能对解决(至少)3个不同问题中的一个感兴趣:
office_id,使期间start_time - end_time完全包含在open_time - close_time期间中。start_time、end_time中至少有一个介于open_time - close_time和office_id之间,使得start_time和end_time都属于此局的任何open_time - close_time周期。<代码>H234<代码>G235问题1)和2)的解决方案是微不足道的。
原始问题表明它实际上是要解决的问题3),即使给定的“预期”表不包含给定示例数据集的正确结果(例如,丢失的office_id = 221,其从06:00到17:30不间断地打开)。
问题3)归结为:
查找所有集合,使得t1
t2
t1 INNER JOIN t2-->
office_id open_time <= start_time <= close_time --> office_id open_time <= end_time <= close_time -->https://stackoverflow.com/questions/66055581
复制相似问题