我有一个名为 events 的简单表
它有日期、开始时间、结束时间和状态
我有多个相同日期、开始和结束的事件。
要知道是否有人可以预约,我必须检查该日期是否开始,结束我有一行状态为假(未占用)。
带有一些示例代码的表定义:
CREATE SEQUENCE events_id_seq;
CREATE TABLE events(
id int4 NOT NULL DEFAULT nextval('events_id_seq'::regclass),
event_date date NULL,
status bool NULL DEFAULT false,
event_start time NULL,
event_end time NULL
) ;
INSERT INTO events(event_date,status,event_start,event_end)
VALUES
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', FALSE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00');
select distinct event_date, event_start, event_end, (
select count(*) from events e1
where
e1.status = false and
e1.event_date = e.event_date and
e1.event_start = e.event_start and
e1.event_end = e.event_end
) as free_slots from
events e
order by event_date, event_start;
http://sqlfiddle.com/#!15/698b7
它有效,但由于我不是 SQL 专家,我只是在寻求其他形式的建议来解决这个问题,只是想多学一点。
如果您只想查看空闲槽的数量,可以使用条件聚合来简化查询:
该
filter()
子句是在 Postgres 9.4 中引入的。如果您仍在使用旧版本,则可以改用CASE
语句:顺便说一句,
status
这不是一个很好的列名称。类似is_taken
或is_full
会更好的东西,可能会减少混乱。