2017-10-15 27 views
0

J'ai une tâche pour créer un déclencheur ou une contrainte dans SQL. Le déclencheur est supposé vérifier si un nouvel événement rentrera dans le planning. Aucun événement ne peut avoir lieu en même temps. Les attributs sont la date, l'heure et la durée de l'événement. Ma pensée est de vérifier les valeurs d'intervalle pour time + length dans les événements avec le temps et la longueur de la nouvelle entrée. Si elles se chevauchent, cela provoquera une exception. Je ne sais pas vraiment comment l'implémenter.Timestamp SQL pour la contrainte d'événement

+0

Nous utilisons Postgres. – Lulle

Répondre

0

Dans Postgres, vous pouvez le faire facilement avec un exclusion constraint, aucun déclencheur requis.

En supposant que votre table ressemble à quelque chose comme ceci:

create table event 
(
    id serial primary key, 
    event_name varchar(100), 
    event_start timestamp, 
    duration interval 
); 

Ensuite, vous pouvez éviter que des événements qui se chevauchent en utilisant la contrainte suivante:

alter table event 
    add constraint no_overlapping_events 
    exclude using gist (tsrange(event_start, event_start + duration) with &&); 

Le tsrange() dans la définition de la contrainte crée un timestamp range qui peut être efficacement comparé pour les lignes qui se chevauchent.

Les deux inserts suivants réussiront:

insert into event (event_name, event_start, duration) 
values ('First', timestamp '2017-10-16 10:00:00', interval '2' hour); 

insert into event (event_start, duration) 
values ('Second', timestamp '2017-10-16 12:00:00', interval '4' hour); 

Cependant, l'insertion suivante échouera comme l'événement "troisième" chevauche l'événement "Second":

insert into event (event_start, duration) 
values ('Third', timestamp '2017-10-16 12:00:00', interval '1' hour); 
+0

Est-ce un moyen d'inclure ceci dans une fonction et d'utiliser un trigger? Et inclure l'arène et le lieu. – Lulle