PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SQL-Abfrage zum Suchen nach Tag/Monat/Jahr/Tag&Monat/Tag&Jahr usw

Sie können wartbare Abfragen schreiben, die zusätzlich schnell sind, indem Sie die Erweiterung pg/temporal verwenden:

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);

Sie können es sogar verwenden, um Überschneidungen als Tabelleneinschränkung zu verbieten:

alter table events
add constraint overlap_excl
exclude using gist(period(start_date, end_date) WITH &&);

Es ist tatsächlich wartbarer als Sie vielleicht denken, z. B.:

select *
from events
join generate_series(:start_date, :end_date, :interval) as datetime
on start_date <= datetime and datetime < end_date;

Aber es ist viel besser, den oben erwähnten Periodentyp zu verwenden.