我正在为表预订系统创建一个数据库。每个表都有自己的时间段列表,我想为每个表找到可用的时间段。所以我有以下表格:
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。怎么做?有可能以最小的开销编写这样的查询吗?最后一个问题,这种系统设计好吗?如果没有,那么在这些场景中什么是更好的设计呢。谢谢!
1条答案
按热度按时间pu82cl6c1#
你可以用
not exists
. 这将在6月1日为您提供所有可用的时段:请注意,这是假设预订不会跨越几天。
表达这个意思可能更有效
where
子查询的子句为:这将利用上的索引
reservations(table_slot_id, start_date, end_date)
.