我有一个包含事件的PostgreSQL数据库。每个事件都有一个日期时间或间隔。公共数据存储在events
表中,日期存储在events_dates
(datetime
字段)或events_intervals
(starts_date
,ends_date
中是date
个字段)。
日期时间事件示例
采样间隔事件
现在我有一个想要查找这些事件的用户。他们将能够填写包含from
和to
字段的表单,在这些字段中,他们可以输入完整日期,日期,月份,年份,日期和月份,日期和年份,月份和年份一个或两个领域。
示例查询
from
为空且to
不为,则相同)有关如何编写maintanable查询的任何提示(它不一定非常快)?
我们想到的一些事情
from
,to
和日/月/年组合 - 不可维护____-06-__
其中_
是通配符 - 我不必生成所有可能的组合,但这对于间隔不起作用答案 0 :(得分:1)
您可以使用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);
您甚至可以使用它来禁止重叠作为表约束:
alter table events
add constraint overlap_excl
exclude using gist(period(start_date, end_date) WITH &&);
写下所有可能的,以及日/月/年组合 - 不是维护
它实际上比你想象的更容易维护,例如:
select *
from events
join generate_series(:start_date, :end_date, :interval) as datetime
on start_date <= datetime and datetime < end_date;
但使用上述句号类型要好得多。