sql >> Base de Datos >  >> RDS >> PostgreSQL

Consulta SQL para buscar por día/mes/año/día y mes/día y año, etc.

Puede escribir consultas mantenibles que además son rápidas usando la extensión 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);

Incluso puede usarlo para no permitir superposiciones como una restricción de tabla:

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

En realidad, es más fácil de mantener de lo que piensas, por ejemplo:

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

Pero es mucho mejor usar el tipo de período mencionado anteriormente.