PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Query SQL per la ricerca per giorno/mese/anno/giorno e mese/giorno e anno ecc

Puoi scrivere query gestibili che sono inoltre veloci utilizzando l'estensione 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);

Puoi anche usarlo per impedire le sovrapposizioni come vincolo di tabella:

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

In realtà è più gestibile di quanto potresti pensare, ad esempio:

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

Ma è molto meglio usare il tipo di periodo sopra menzionato.