Brauche hilfe, doppelte daten erkennen



  • hi,

    ich habe so eine art organizer. An einen bestimmten Datum bsp. 1.7.03 habe ich 3 einträge, alle beginn 15 uhr ende 16 uhr, allerdings haben alle diese einträge einen anderen text bsp. Test, Test2, Test3. Am 1.7.03 habe ich auch noch um 17 Uhr einen eintrag.

    Hier noch mal die Einträge zum verdeutlichen:

    datum ; beginn ; ende ; text
    1.7.03 ; 15 uhr ; 16 Uhr ; Test
    1.7.03 ; 15 uhr ; 16 Uhr ; Test2
    1.7.03 ; 15 uhr ; 16 Uhr ; Test3
    1.7.03 ; 17 uhr ; 18 Uhr ; Test5

    Ich will die dauer der einträge ermitteln. Bsp. 15 - 16 Uhr = 1 Stunde. Soweit so einfach, allerdings sind dort 3 einträge zur selben Zeit, d.h. wenn ich die dauer jedes eintrages einfach addiere erhalte ich 3 Stunden. Aber es ist ja alles zur selben Zeit, richtig = 1 Stunde. Wie kann ich das lösen? Dublikate sind es ja nicht, da der Text anders ist.



  • Ist das ein Organizer für Leute mit multipler Schizophrenie, dass du für denselben Zeitraum drei verschiedene Termine zulässt? 😉

    In welchem Format (Variablentyp) liegen die Daten denn vor?



  • also wenn Du die mehrfachen Einträge aus welchem Grund auch immer nicht ausschließen willst, dann prüfe doch einfach, ob Zeitbereich X in einem vorherigen Zeitbereich Y vorhanden ist. Falls ja, dann zählst Du den neuen nicht.

    Aber letztendlich macht das keinen Sinn. Wieso wären 3 Stunden nicht richtig? Eine Person kann zur selben Zeit ja nur auf einer Party tanzen. Also sind auch 3 parallele Termine blödsinn. Wenn Du die eliminierst, dann stimmt Deine Zeitrechnerei doch wieder?



  • nein 😃

    ich benutze die MyLittleBase also normaler text.



  • Hi Marek,

    ein möglicher Ansatz (nicht getestet!):

    int nMinuten = 0;
    
    for(int iStd = 0; iStd < 24; iStd++)
    {
      for(int iMin = 0; iMin < 60; iMin++)
      {
        int iZeit = iStd * 100 + iMin;
    
        for(int iEintrag = 0; iEintrag < nEintraege; iEintrag++)
        {
          nZeitVon = Eintraege[iEintrag].nZeitVon;
          nZeitBis = Eintraege[iEintrag].nZeitBis;
    
          if(iZeit >= nZeitVon && iZeit <= nZeitBis)
          {
            nMinuten++;
            break;
          }
        }
      }
    }
    

    Dieser Ansatz geht davon aus, daß die Einträge in einem Array 'Eintraege' vorliegen, in dem die Von- und Bis-Zeiten als Integer in der Form HHMM enthalten sind. Mußt Du ggf. anpassen, falls das bei Dir anders ist...

    Gruß,
    Stefan



  • Also wenn Du eine DB verwendest, weshalb gruppierst Du nicht einfach nach den drei Spalten Datum, Beginn und Ende? Dabei werden alle Duplikate eliminiert und Du kannst mit der so reduzierten Menge Deine Zeitberechnung vornehmen?



  • Also wenn Du eine DB verwendest, weshalb gruppierst Du nicht einfach nach den drei Spalten Datum, Beginn und Ende? Dabei werden alle Duplikate eliminiert und Du kannst mit der so reduzierten Menge Deine Zeitberechnung vornehmen?

    Und was macht er, wenn sich die Zeiten nur teilweise überschneiden? Wenn ich das richtig verstanden habe, dann soll ein "belegter" Zeitpunkt nicht mehrfach gezählt werden.



  • Die Frage hab ich mir vorhin schon gestellt und bin deshalb zum Schluß gekommen, daß die Anforderung von Marek keinen rechten Sinn macht.

    Zähl ich 15.45 bis 16.15 und 16.00 bis 17.00 Uhr als 1 Stunde, als 1,25 Stunden oder als 0,5 Stunden?

    Wenn 1,25 Stunden rauskommen soll, müßte man die Datensätze in die richtige Reihenfolge kriegen und muß dann Zeiträume bilden (Min / Max Werte ermitteln). Das mit der Reihenfolge macht die Gruppierung bestens, weil die Deckungsgleiche Einträge eliminiert und chronologisch sortiert. Die Min / Max Werte muß man aber von Hand ermitteln. Mit SQL wäre das sicher zu aufwändig....

    Deine Lösung kommt auch zum richtigen Ziel. Bei größeren Datenmengen ist das aber ziemlich aufwändig und braucht ne Menge CPU. Is für mich damit eher eine Holzhammermethode, weil bei 10.000 Terminen siehste schnell alt aus...


Anmelden zum Antworten