Crear un indice único con un rango de fechas para que no exista un registro en el mismo rango de fecha y hora en postgresql es muy sencillo, lo explicaremos un ejemplo:
Imaginemos que tenemos un calendario de citas medicos con la estructura:
id_medico | Int |
---|---|
fecha_inicial | timestamp |
fecha_final | timestamp |
Lo que queremos lograr es que no se permita para él mismo id_medico un registro que este sobrepuesto sobre otro usando el rango de fecha. Es decir:
suponiendo que ya tenemos un registro para el ID = 1 con la fecha inicial = 2021-04-22 08:00:00 y fecha final = 2021-04-22 10:00:00 y queremos insertar un nuevo registro para el mismo ID medico con fecha inicial = 2021-04-22 07:00:00 y fecha final =2021-04-22 09:00:00 no debería permitir el INSERT, para lograr esto solo debemos crear un indice único usando EXCLUDE y tsrange de postgresql con la siguiente sentencia:
ALTER TABLE [NOMBRE_TABLA] ADD CONSTRAINT [NOMBRE_INDICE]
EXCLUDE USING GIST (id_medico WITH =, tsrange(fecha_inicial, fecha_final) WITH &&)
Debes tener la extensión btree_gist instalada, si no la tienes puedes instalarla con el siguiente código:
CREATE EXTENSION IF NOT EXISTS btree_gist;
Recursos
Te comparto un ejemplo funcional de esta publicación
