none
Logik-Problem bei DateTime-Validierung mit LINQ RRS feed

  • 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
    Montag, 7. Februar 2011 10:21

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

    Montag, 7. Februar 2011 11:14
    Moderator

Alle Antworten

  • Hi,

    auf den ersten blick :

    p.StartDate >= appointmentStart && p.EndDate <= appointmentEnd

     

    Montag, 7. Februar 2011 11:06
  • 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

    Montag, 7. Februar 2011 11:14
    Moderator
  • Hallo Marcel

    genau das was ich heute vormittag versucht habe zu erstellen..................und es mir einfach nicht gelingen wollte. 

    Vielen Dank !!!! & Schönen Gruß

    Michael


    Michael Erlinger
    Montag, 7. Februar 2011 12:16