Utiliser C # pour créer un "calendar mensuel / agenda calendar" dans une table SQL

Pour le context, je crée une database pour une clinique vétérinaire.

J'ai une table SQL dans Microsoft SQL Server Management Studio 2014 avec le model relationnel (schéma) comme suit: ScheduleSlot (slotID, pièce, date, startTime, endTime, ID de rendez-vous, staff_id) que je voudrais pré-remplir partiellement.

  • rendez-vous et staff_id sont des foeign_keys qui peuvent et devraient être null dans le but de ce "calendar vide"
  • La clinique de ventilation est ouverte seulement 6 jours par semaine et est fermée le dimanche.
  • Chaque rendez-vous possible est une demi-heure.
  • Les heures d'ouverture sont de 8h00 à 17h00.

Je voudrais créer une structure de journal qui vous permette chaque jour de définir les locations possibles pour lesquels un vétérinaire pourrait être disponible.

Par exemple, je voudrais produire quelque chose comme ça pour tous les 26 jours pas dimanche en mai 2016:

slotId date startTime endTime room appointment_id staff_id 1 5/2/2016 8:00 8:30 1 null null 2 5/2/2016 8:00 8:30 2 null null 3 5/2/2016 8:00 8:30 3 null null 4 5/2/2016 8:00 8:30 4 null null 5 5/2/2016 8:30 9:00 1 null null 6 5/2/2016 8:30 9:00 2 null null 7 5/2/2016 8:30 9:00 3 null null 8 5/2/2016 8:30 9:00 4 null null 9 5/2/2016 9:00 9:30 1 null null 10 5/2/2016 9:00 9:30 2 null null 11 5/2/2016 9:00 9:30 3 null null 12 5/2/2016 9:30 9:30 4 null null ... ... ... ... ... ... ... 

Pour reference, il devrait y avoir 72 slots (18 intervalles x 4 pièces posiblités) par jour pour un mois, et pour le mois de mai 2016, environ 1872 slots (72 x 26).


Ma solution possible est d'utiliser un modulo (boucle) qui vérifie si je% 7 == 0 et le saute? – La boucle for pourrait passer un paramètre comme première date et fonctionner jusqu'à la fin du mois.

Ne fais pas ça .

Ayez juste une table de rendez-vous qui stocke quand les rendez-vous sont programmés.

SQL ne devrait généralement pas être responsable des règles métier.

Faites-le dans votre niveau intermédiaire, ou là où vous gérez votre logique métier, avant de le remettre à la database pour le stockage.

Si un jour donné, vous n'avez que 2 rendez-vous, vous ne devriez avoir que 2 lignes pour ce jour. Pas un tas de lignes avec tous les intervalles de time disponibles et les valeurs NULL. C'est un gaspillage d'espace et de frais généraux inutiles.

Si vous souhaitez forcer l'intégrité du côté de la database, assurez-vous que rien de valide ne passe à travers votre couche d'access aux données (rendez-vous en dehors des heures d'ouverture ou chevauchement des rendez-vous). logique, ou tout envoyer à travers une procédure stockée qui fait la même chose.

Comme @Pasortingck a dit Ne pas le faire , parce que, après un certain time, vous avez beaucoup de données de déchets, vous devriez le supprimer. Ce genre de poubelle serait faire quelques problèmes dans les rapports.

Ainsi, si j'étais vous, je créerais une table pour programmer comme des salles, la durée, l'heure de début, l'heure de fin, … et quand je veux insert un nouveau rendez-vous, j'essaye de créer un nouveau rendez-vous par la règle dernier rendez-vous.

par exemple, le dernier rendez-vous est le 5/2/2016 à 13h00 dans la salle n ° 1, et dans le tableau des horaires je sais que la durée de la réunion est de la demi-heure,

donc je crée un nouveau rendez-vous pour la chambre n ° 1 au 5/2/2016 à 14:30

Aussi, vous pouvez find beaucoup de solutions pour le faire de la meilleure façon.

Si vous voulez vraiment pré-remplir une table avec les valeurs souhaitées, vous pouvez l'utiliser

 DECLARE @desiredMonth int = 5; DECLARE @desiredYear int = 2016; SELECT StartDate, DATEADD(minute, 30, StartDate) AS EndDate, rooms AS Room FROM ( SELECT /* Construct StartDate */ dateadd(minute, minutes, dateadd(hour, hours, dateadd(day, days - 1, dateadd(month, @desiredMonth - 1, dateadd(year, @desiredYear - 1900, 0))))) AS StartDate, minutes, rooms FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31)) AS W(days) CROSS JOIN (VALUES (8), (9), (10), (12), (12), (13), (14), (15), (16)) AS X(hours) CROSS JOIN (VALUES (00), (30)) AS Y(minutes) CROSS JOIN (VALUES (1), (2), (3), (4)) AS Z(rooms) /* Check, that only days are included for desired month */ WHERE DATEPART(m, dateadd(hour, hours, dateadd(day, days - 1, dateadd(month, @desiredMonth - 1, dateadd(year, @desiredYear - 1900, 0))))) = @desiredMonth ) AS SubQuery01 

Mais je suis d'accord avec les autres opinions, que d'habitude vous ne devriez pas faire de telles choses. Peut-être que c'est mieux pour l'utiliser dans une vue?