Bạn có thể viết các truy vấn có thể bảo trì được nhanh chóng bằng cách sử dụng phần mở rộng pg / temporal:
https://github.com/jeff-davis/PostgreSQL-Temporal
create index on events using gist(period(start_date, end_date));
select *
from events
where period(start_date, end_date) @> :date;
select *
from events
where period(start_date, end_date) && period(:start, :end);
Bạn thậm chí có thể sử dụng nó để không cho phép chồng chéo làm ràng buộc bảng:
alter table events
add constraint overlap_excl
exclude using gist(period(start_date, end_date) WITH &&);
Nó thực sự dễ bảo trì hơn bạn có thể nghĩ, ví dụ:
select *
from events
join generate_series(:start_date, :end_date, :interval) as datetime
on start_date <= datetime and datetime < end_date;
Nhưng sẽ tốt hơn nhiều nếu sử dụng kiểu khoảng thời gian được đề cập ở trên.