Laden...

Zuschlagsfähige Stunden in gegebener Zeitspanne berechen

Erstellt von aX3l vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.339 Views
A
aX3l Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren
Zuschlagsfähige Stunden in gegebener Zeitspanne berechen

Hallo Community,

Folgende Situation:

Ich habe eine feste Zeitspanne von 22:00 - 06:00 Uhr und eine variable Zeitspanne x - y die ich aus einer Datenbank auslese.
Ziel soll es sein die Anzahl der Stunden zu bekommen, die sich innerhalb der festen Zeitspanne (Nachtzuschlag) befinden.

Meine derzeitige Entwicklungsumgebung ist MSVS2010 C#

Ich hab mich schon ein wenig im Forum umgeschaut, aber nix gefunden was mir weiterhilft. Für einen Denkanstoß wäre ich mehr als dankbar!

J
251 Beiträge seit 2012
vor 11 Jahren

hey aX3l,

Vllt. könnst du statt nur mit der Uhrzeit zu arbeiten auch noch mit dem Datum arbeiten und darüber hinaus sollte DateTime für dich eine große Hilfe sein, um passende Berechnungen bzw. Abfragen zu machen.

bzw. vllt hilft dir TimeSpan allein auch für die Uhrzeit.

Schließlich musst du ja nur überprüfen, ob x und/oder y in deinen konstanten Zeitrahmen sich befinden.

1.552 Beiträge seit 2010
vor 11 Jahren

Hallo aX3l,

hast du schon mal probiert dein Problem auf einem Blatt Papier zu lösen? Wie sähen die Lösungsschritte aus wenn du nicht es nicht mit dem Computer machen würdest? Dies ist der erste Schritt, die Implementierung in C# ist dann nach dem Verstehen der Aufgabenstellung und dem Wissen der Lösungsschritte nur noch ein Leichtes.

Überlegungen:*Fällt der Anfang und das Ende der Zeitspanne mit dem Anfang und dem Ende der Nachtschicht zusammen? *Ist das Ende in der Nachtschicht, der Anfang nicht? (End Inside / End touching) *Ist der Anfang in der Nachtschicht, das Ende nicht? (Start Inside /Start touching) *Ist weder der Anfang noch das Ende in der Nachtschicht, überspannt diesen jedoch?

Gruß,
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

A
aX3l Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Danke für die schnelle Antwort Jungs.

@xxMUROxx:
Da hast du wohl Recht, irgendwie kommt das beim Programmieren viel zu kurz, mir war auch klar das ich kein Syntax - Problem habe, vielmehr macht mir der Algorithmus sorgen.
Also Papier und Bleistift schnappen und einen PAP machen! 😉

@Jamikus:
Datenbankdesign ist gegeben, und kann nicht mehr geändert werden. Hab aber auch schon ein bisschen mit DateTime gearbeitet, hatte aber keine Idee das dynamisch zu gestalten. Mit TimeSpan hab ich bis jetzt nur sehr wenig Erfahrungen. Aber auch diese Variante werde ich mir mal anschauen.

Danke für die Tipps, ich melde mich wieder wenn ich was erreicht habe!

A
aX3l Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Ich glaube ich hab schonmal einen Ansatz.

Folgende Überlegung ist noch nicht berücksichtigt: Ist der Anfang nicht in der Nachtschicht, aber die Arbeitszeit trotzdem Anrechnungsfähig?


DateTime aTag_begin = new DateTime(jahr, monat, tag, stundeA, minuteA, 0);
DateTime aTag_ende = new DateTime(jahr, monat, tag, stundeB, minuteB, 0);

nZ_ende = new DateTime(jahr, monat, tag, 6, 0, 0);
if (aTag_begin.TimeOfDay.Hours >= 22 || aTag_begin.TimeOfDay.Hours < 6)
{
  if (aTag_ende.TimeOfDay.Hours >= 6)
  {
     double temp = nZ_ende.Subtract(aTag_begin).TotalHours;
     if (temp <= 0) temp += 24;
     stdZuschlag += temp;
  }
  else if (aTag_ende.TimeOfDay.Hours < 6)
  {
     double temp = aTag_ende.Subtract(aTag_begin).TotalHours;
     if (temp <= 0) temp += 24;
     stdZuschlag += temp;
  }
}

Die Variablen jahr, monat, tag, stundeA, minuteA, stundeB, minuteB lese ich mit der DATEPART Funktion aus der DB.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo aX3l,

das gab es aber schon im Forum, z.B. in Suche Denkansätze für die Berechnung von Zeiten.

Außerdem hatten wir das erst neulich als Aufgabe im Programmierspiel, siehe Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch inkl. mehrerer Lösungen. Meine steht in Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch.

herbivore

A
aX3l Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Vielen Dank für die Hilfe!

Ich denke ich hab jetzt einer Version die fast alle Möglichkeiten abdenkt.

Hier mein Lösungsansatz, für die die ein ähnliches Problem lösen wollen:


while (DataReader.Read())
                {
                    //Hilfsvariablen beladen
                    jahr = Convert.ToInt32(DataReader.GetValue(0));
                    monat = Convert.ToInt32(DataReader.GetValue(1));
                    tag = Convert.ToInt32(DataReader.GetValue(2));
                    stundeA = Convert.ToInt32(DataReader.GetValue(3));
                    minuteA = Convert.ToInt32(DataReader.GetValue(4));
                    stundeB = Convert.ToInt32(DataReader.GetValue(5));
                    minuteB = Convert.ToInt32(DataReader.GetValue(6));

                    aTag_begin = new DateTime(jahr, monat, tag, stundeA, minuteA, 0);
                    aTag_ende = new DateTime(jahr, monat, tag, stundeB, minuteB, 0);

                    //Suchradius erweitern
                    suche = nZAnfang - 4;
                    if (suche < 0) suche += 24;

                    if (aTag_begin.TimeOfDay.Hours >= suche || aTag_begin.TimeOfDay.Hours < nZEnde)
                    {
                        while ((int)aTag_begin.TimeOfDay.Hours != (int)aTag_ende.TimeOfDay.TotalHours)
                        {
                            if (aTag_begin.TimeOfDay.TotalHours >= nZAnfang && aTag_ende.TimeOfDay.TotalHours < nZEnde)
                            {
                                double temp = aTag_ende.Subtract(aTag_begin).TotalHours;

                                if (temp <= 0) temp += 24;

                                stdZuschlag += temp;
                                break;
                            }
                            else if (aTag_begin.TimeOfDay.TotalHours >= nZAnfang && aTag_ende.TimeOfDay.TotalHours >= nZEnde)
                            {
                                double temp = nZEnde - aTag_begin.TimeOfDay.TotalHours;

                                if (temp <= 0) temp += 24;

                                stdZuschlag += temp;
                                break;
                            }
                            else if (aTag_begin.TimeOfDay.TotalHours < nZEnde)
                            {
                                if (aTag_ende.TimeOfDay.TotalHours > nZEnde)
                                {
                                    double temp = nZEnde - aTag_begin.TimeOfDay.TotalHours;

                                    if (temp <= 0) temp += 24;

                                    stdZuschlag += temp;
                                    break;
                                }
                                else if (aTag_ende.TimeOfDay.TotalHours <= nZEnde)
                                {
                                    double temp = aTag_ende.Subtract(aTag_begin).TotalHours;

                                    if (temp <= 0) temp += 24;

                                    stdZuschlag += temp;
                                    break;
                                }
                            }

                            aTag_begin = aTag_begin.AddHours(1);
                        }                        
                    }
                }

Wobei noch gesagt sei das die Variablen nZAnfang und nZEnde ebenfalls aus einer Datenbank geladen werden.
Der Rest sollte sprechend genug sein.

Nochmal danke an alle, die mir mit Rat und Tat zur Seite standen! 👍