PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Requête SQL pour rechercher par jour/mois/année/jour&mois/jour&année etc.

Vous pouvez écrire des requêtes maintenables qui sont en plus rapides en utilisant l'extension 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);

Vous pouvez même l'utiliser pour interdire les chevauchements en tant que contrainte de table :

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

Il est en fait plus maintenable que vous ne le pensez, par exemple :

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

Mais il est préférable d'utiliser le type de période mentionné ci-dessus.