Benutzer mit den meisten Antworten
Logik-Problem bei DateTime-Validierung mit LINQ

Frage
-
Hallo
ich stehe jetzt gerade total auf Leitung, und bitte um Eure Hilfe: Ich muss im Programm eine Termin-Validierung durchführen, ob zu einer bestimmten Person zu dem neue Datum und Uhrzeit schon Termine in einer Entität vorhanden sind. Ich möchte das mit einer LINQ-Abfrage durchführen
Mein Problem ist, dass ich keine Termin-Überschneidung zulassen darf - ich habe es jetzt schon mal soweit, dass die Prüfung für Termine "nach" den bestehende Terminen erfolgreich verläuft - aber zum Beispiel für neue Termine die "vor" den bestehenden Terminen eingetragen werden können - und hier Überschneidungen sind - ich einfach nicht finde.
public IEnumerable<Termin2> ValidateTermine(Guid primaryKeyPatientenFall, DateTime appointmentStart, DateTime appointmentEnd, bool changeTrackingEnabled = false) { var list = (from p in this.GetBaseQuery(). Include("Termin2_FallLeistungen") where p.Termin2_FallLeistungen.PatFall == primaryKeyPatientenFall && (p.StartDate >= appointmentStart && p.EndDate < appointmentStart) //|| ( p.StartDate < appointmentEnd && p.EndDate > appointmentEnd) select p).ToList(); if (list != null) SetChangeTrackingEnabled(list, changeTrackingEnabled); return list; }
als Beispiel gibt es für die Person A
- Termin -1 am 17.5.2011 - von 9.00 bis 9.30
- Termin -2 am 17.5.2011 - von 9.30 bis 10.45
Jetzt darf genau in diesem Zeitraum kein weiterer Termin angelegt werden - und auch davor kein Termin, der sich mit dem ersten Termin - beginnend um 09.00 Uhr - überschneidet.
Kann mir dazu bitte jemand bei der Logik der Abfrage für die TerminÜberschneidungen weiterhelfen ??
Vielen Dank schon mal & schönen Gruß
Michael
Michael Erlinger
Antworten
-
Hallo Michael,
Da ich Dein Modell nicht kenne, werde ich das hier mit einem SQL Skript zu verdeutlichen versuchen:
USE TestDb DECLARE @neuerTerminStart datetime DECLARE @neuerTerminEnde datetime SET @neuerTerminStart = '07.02.2011 08:30:00' SET @neuerTerminEnde = '07.02.2011 09:31:00' SELECT * FROM Termine WHERE (StartDate <= @neuerTerminStart AND @neuerTerminStart <= EndDate) OR (StartDate <= @neuerTerminEnde AND @neuerTerminEnde <= EndDate) OR (@neuerTerminStart <= StartDate AND @neuerTerminEnde >= EndDate)
Sollte es eine Terminüberschneidung geben, erhältst Du entspr. Rückgabedaten.Folgende Fälle werden abgedeckt:
1. Der Start-Zeitpunkt des neuen Termins liegt innerhalb einer bereits gebuchten Zeitspanne.
2. Der End-Zeitpunkt des neuen Termins liegt innerhalb einer bereits gebuchten Zeitspanne.3. Die gesamte Zeitspanne des neuen Termins überspannt/umfaßt eine bereits gebuchte Zeitspanne.Gruss
Marcel- Als Antwort markiert M.Erlinger Montag, 7. Februar 2011 12:16
- Bearbeitet Marcel RomaModerator Montag, 7. Februar 2011 12:57 Formatierung
Alle Antworten
-
Hallo Michael,
Da ich Dein Modell nicht kenne, werde ich das hier mit einem SQL Skript zu verdeutlichen versuchen:
USE TestDb DECLARE @neuerTerminStart datetime DECLARE @neuerTerminEnde datetime SET @neuerTerminStart = '07.02.2011 08:30:00' SET @neuerTerminEnde = '07.02.2011 09:31:00' SELECT * FROM Termine WHERE (StartDate <= @neuerTerminStart AND @neuerTerminStart <= EndDate) OR (StartDate <= @neuerTerminEnde AND @neuerTerminEnde <= EndDate) OR (@neuerTerminStart <= StartDate AND @neuerTerminEnde >= EndDate)
Sollte es eine Terminüberschneidung geben, erhältst Du entspr. Rückgabedaten.Folgende Fälle werden abgedeckt:
1. Der Start-Zeitpunkt des neuen Termins liegt innerhalb einer bereits gebuchten Zeitspanne.
2. Der End-Zeitpunkt des neuen Termins liegt innerhalb einer bereits gebuchten Zeitspanne.3. Die gesamte Zeitspanne des neuen Termins überspannt/umfaßt eine bereits gebuchte Zeitspanne.Gruss
Marcel- Als Antwort markiert M.Erlinger Montag, 7. Februar 2011 12:16
- Bearbeitet Marcel RomaModerator Montag, 7. Februar 2011 12:57 Formatierung