2017-03-16 2 views
1

Du point de vue de la base de données, quelle est la meilleure mise en œuvre/conception tenant compte:conception de base de données pour événements récurrents de calendrier avec infinités

  1. événements de calendrier récurrents qui sont infinis (sans date de fin)? Évidemment, cela n'a aucun sens de remplir les enregistrements de base de données pour chaque événement! Après la création d'événements récurrents, quelle est la meilleure approche pour éditer un seul événement qui casse la règle récurrente? Par exemple, "Tous les lundis à 9h00", mais un lundi particulier doit commencer à 10h00.

Répondre

0

Il est difficile de suggérer des modifications à un schéma sans aucun détail, mais il y a un moyen de le faire. Ce que vous avez est une entrée qui dit "à partir de cette date, l'heure de la réunion est ce jour à ce moment."

EffDate DOW Time 
01/01/2017 Mon 0900 
03/14/2017 Mon 1000 
03/21/2017 Mon 0900 

À partir du premier jour de l'horaire, le 1er janvier, la réunion aura lieu le lundi à 9h. Puis, à partir du mardi avant qu'il ne prenne effet, la réunion le lundi suivant (le 20) sera à 10h. En recommençant le 21, l'heure de la réunion revient à 9h.

La requête pour faire ce travail semble un peu compliquée, mais suivez la logique et il devrait être évident.

select Dow "Day of meeting", Time 
from MeetingSchedule ms 
where ms.EffDate =(
     select Max(ms1.EffDate) 
     from MeetingSchedule ms1 
     where ms1.EffDate <= Today() 
     ); 

Si cette requête est exécutée tout moment à compter du 1er janvier au juste avant le 14 Mar (qui est un mardi), le retour affichera lundi à 9 heures. À partir du lendemain et pour une semaine entière, le retour sera montré lundi à 10h. Puis, à partir du jour suivant (et à partir de ce moment-là), l'heure sera à nouveau affichée à 9h.

Bien sûr, vous voudrez peut-être savoir quelle sera l'heure de la réunion un lundi donné. La date ira dans une variable qui remplacera la fonction retournant la date d'exécution.

select :DateOfInterest "Week starting", Dow "Day of meeting", Time 
from MeetingSchedule ms 
where ms.EffDate =(
     select Max(ms1.EffDate) 
     from MeetingSchedule ms1 
     where ms1.EffDate <= :DateOfInterest 
     ); 

En supposant que vous passez par une boucle générant les dates des dimanches consécutifs, la sortie ressemblera à ceci pour le mois de Mars:

Week starting Day of meeting Time 
    03/05/2017 Mon   0900 
    03/12/2017 Mon   0900 
    03/19/2017 Mon   1000 
    03/26/2017 Mon   0900 

Mais la bonne réponse sera donnée à toute date postérieure la dernière réunion avant le changement à la date de la réunion elle-même. Si l'heure devait changer à 10h à partir de ce moment, éliminez simplement la dernière rangée, qui revient à 9h du matin.

J'ai ajouté le jour de la semaine, mais vous pouvez le laisser de côté si vous savez que la réunion sera toujours, toujours un lundi.