查找表保留系统的可用时隙

uubf1zoe  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(376)

我正在为表预订系统创建一个数据库。每个表都有自己的时间段列表,我想为每个表找到可用的时间段。所以我有以下表格:

time_slots table
----------------------------------
id || table_id || weekday ||  time
==================================
 1           1          1    12:00
 2           1          1    12:30
...
11           1          1    16:00
...
17           1          1    19:00
18           1          1    19:30
...
27           1          1    00:00
==================================

reservations table
-----------------------------------------------------------------
id || table_slot_id ||          start_date ||            end_date
=================================================================
 1                1    2020-06-01 12:00:00    2020-06-01 12:20:00
 2                1    2020-06-01 16:00:00    2020-06-01 19:00:00
=================================================================

我编写了一个查询,它允许查找所有保留的时隙:

SELECT *
FROM table_slots, (SELECT * 
                   FROM reservations 
                   WHERE reservations.start_date::date = '2020-06-01'::date) as res
WHERE table_slots.weekday = extract(dow from '2020-06-01'::date)
AND table_slots.time BETWEEN res.start_date::time and res.end_date::time
ORDER BY table_slots.time

但我不明白如何编写查询来查找可用的时隙。所以我希望结果应该包含所有时间在12:30到15:30之间的时隙;19:30和00:00。怎么做?有可能以最小的开销编写这样的查询吗?最后一个问题,这种系统设计好吗?如果没有,那么在这些场景中什么是更好的设计呢。谢谢!

pu82cl6c

pu82cl6c1#

你可以用 not exists . 这将在6月1日为您提供所有可用的时段:

select ts.*
from time_slots ts
where not exists (
    select 1
    from reservations r
    where 
        r.table_slot_id = ts.id
        and r.start_date >= '2020-06-01'::date
        and r.start_date <  '2020-07-01'::date
        and r.start_date::time <= ts.time
        and r.end_date::time   >  ts.time 
)

请注意,这是假设预订不会跨越几天。
表达这个意思可能更有效 where 子查询的子句为:

where 
        r.table_slot_id = ts.id
        and r.start_date >= '2020-06-01'::date
        and r.start_date <= '2020-06-01'::date + ts.time::interval
        and r.end_date   >  '2020-06-01'::date + ts.time::interval

这将利用上的索引 reservations(table_slot_id, start_date, end_date) .

相关问题