1

Arbeitstage berechenen

Guten Morgen,
hat jemand eine Idee für folgende Fragestellung?

Mit workdays(Datum1, Datum2) läßt sich die Anzahl der Arbeitstage zwischen Datum1 und Datum2 berechnen.
Ich kenne das Ausgangsdatum und die Zahl der Arbeitstage, muss also das zweite Datum mit diesen beiden bekannten Werten berechnen.

Geht das? Und wenn, wie?

Vielen Dank fürs Nachdenken, mir fällt's leider nicht ein.

33 Antworten

null
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Also Buß- und Betttag ist der Mittwoch 11 Tage vor dem 1. Advent.
    4.Adwent ist der Sonntag vor Weihnachten. Wenn Weihnachten auf Montag fällt, ist der 4.Adwent so zu errechnen:

    date(Jahr,12,25)-1

    Die Wochentage werden bei Ninox mit 0-1 errechnet(0-Mo,1-Di,2-Mi usw.).Wenn ich jetzt den (Wochentag+1) von dem Weihnachtstag subtrahiere,bekomme ich mein 4.Advent:

    date(Jahr,12,25)-(weekday(date(Jahr,12,25)+1)

    Jetzt bleibt nur 3 Wochen und 11 Tage zu subtrahieren (21+11=32)

    date(Jahr,12,25)-(weekday(date(Jahr,12,25)+1)-32

    Die Formel für Buß- und Betttag wäre dann:

    ‘Buss- und Bettag’:=date(Jahr, 12, 25) - weekday(date(Jahr, 12, 25)) - 33

    Grüße
    Leo
    • AxelE
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Holzi, danke für den Hinweis. Der Gründonnerstag zählt rein formal zu den gesetzlichen Feiertagen, weil es in Baden-Württemberg eine gesetzliche Regelung dazu gibt: Nämlich die, dass an diesem Tag (wie auch am Reformationstag) im ganzen Land schulfrei ist. Auf die arbeitsfreien Tage hat das natürlich keinen Einfluss, weshalb bei allen Bundesländern "Nein" eingetragen ist.

    Du hast aber insofern Recht, als man bei "Gesetzlich" genauso gut auch "Nein" eintragen könnte. Ändern würde es rein praktisch aber erst mal nichts. Denn im Grunde ist das Feld nur eine Zusatzinformation. Es hat keine Bedeutung für die Ermittlung arbeitsfreier Feiertage, welche sich aus den Ja/Nein-Angaben der Bundesländer ergeben.

    Ich freue mich aber wirklich darüber, dass du genau hinschaust, denn natürlich ist es möglich, dass ich irgendwo einen Denk- oder Flüchtigkeitsfehler begangen habe, der mir bei meinen Stichproben nicht aufgefallen ist. Und ich finde eure Formeln zur Berechnung der Feiertage auch keineswegs überflüssig, denn sie erweitern das Spektrum und ermöglichen noch andere, wahrscheinlich elegantere Herangehensweisen.

    Mit den Jahrestagen habt ihr natürlich auch Recht. Ich hatte nur das aktuelle Jahr überflogen, deshalb war mir das nicht aufgefallen. Aber in den Folgejahren wiederholen sich die Daten ja. 2019 hätten wir also schon zwei mal Ostern ... Das wäre sozusagen die arbeitnehmerfreundliche Variante. ;)

    Apropos Variante: Es gibt noch eine alternative Möglichkeit zur Berechnung des Buß- und Bettages. Es ist immer der Mittwoch vor dem 23. November. Das aber nur der Vollständigkeit halber.
    • Peter_Gaede
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Der Thread ist zwar schon ein paar Monate alt, aber ich fands interessant, die Berechnung der Feiertage mit Ninox NX umzusetzen. Vielleicht kann der eine oder andere das gebrauchen.

    function getOstersonntag(myYear : number) do
    let k := myYear / 100;
    let m := 15 + (3 * k + 3) / 4 - (8 * k + 13) / 25;
    let s := 2 - (3 * k + 3) / 4;
    let a := myYear % 19;
    let d := (19 * a + m) % 30;
    let r := (d + a / 11) / 29;
    let og := 21 + d - r;
    let sz := 7 - (myYear + myYear / 4 + s) % 7;
    let oe := 7 - (og - sz) % 7;
    let os := og + oe;
    let OsterMonat := 2 + floor((os + 30) / 31);
    let OsterTag := os - 31 * floor(OsterMonat / 4);
    date(myYear, OsterMonat, OsterTag)
    end;
    "";
    function getKarfreitag(myYear : number) do
    let myDate := getOstersonntag(myYear);
    date(year(myDate), month(myDate), day(myDate) - 2)
    end;
    "";
    function getOstermontag(myYear : number) do
    let myDate := getOstersonntag(myYear);
    date(year(myDate), month(myDate), day(myDate) + 1)
    end;
    "";
    function getChristiHimmelfahrt(myYear : number) do
    let myDate := getOstersonntag(myYear);
    date(year(myDate), month(myDate), day(myDate) + 39)
    end;
    function getPfingstSonntag(myYear : number) do
    let myDate := getOstersonntag(myYear);
    date(year(myDate), month(myDate), day(myDate) + 49)
    end;
    "";
    function getPfingstMontag(myYear : number) do
    let myDate := getOstersonntag(myYear);
    date(year(myDate), month(myDate), day(myDate) + 50)
    end;
    "";
    function getBussUndBettag(myYear : number) do
    let startDate := date(myYear, 11, 22);
    let startDayOfWeek := weekday(startDate);
    let targetDayOfWeek := 2;
    let diff := 0;
    if startDayOfWeek < targetDayOfWeek then
    diff := 2 - startDayOfWeek - 7
    else
    if startDayOfWeek > targetDayOfWeek then
    diff := 2 - startDayOfWeek
    end
    end;
    date(year(startDate), month(startDate), day(startDate) + diff)
    end;
    "";
    function getNeujahr(myYear : number) do
    date(myYear, 1, 1)
    end;
    "";
    function getTagDerArbeit(myYear : number) do
    date(myYear, 1, 5)
    end;
    "";
    function getTagDerDeutschenEinheit(myYear : number) do
    date(myYear, 10, 3)
    end;
    "";
    "Nicht bundesweit";
    function getReformationstag(myYear : number) do
    date(myYear, 10, 31)
    end;
    "";
    "Nicht bundesweit";
    function getAllerheiligen(myYear : number) do
    date(myYear, 11, 1)
    end;
    "";
    function getErstenWeihnachtstag(myYear : number) do
    date(myYear, 12, 25)
    end;
    "";
    function getZweitenWeihnachtstag(myYear : number) do
    date(myYear, 12, 25)
    end;

    • Peter_Gaede
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Leider gehen beim Einfügen von Code trotz der Code-Tags die Einrückungen verloren...

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Peter, Respekt für die Mühe. Bei Bedarf gibt es als Alternative im Webinar-Team eine Datenbank namens "210_Function_IstFeiertag", die mit Tabellen arbeitet und anhand einer beliebigen Postleitzahl auch die unterschiedlichen Regelungen der einzelnen Bundesländer berücksichtigt. Damit lässt sich schnell ermitteln, ob ein Datum an einem bestimmten Ort ein Feiertag ist.

    • Torsten_Stang.1
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Die Funktion für den zweiten Weihnachtstag sollte wohl sein:

     

    function getZweitenWeihnachtstag(myYear : number) do
    date(myYear, 12, 26)
    end;

    lg, Torsten

    • Peter_Gaede
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Stimmt, Tippfehler.

    • Dirk_Pulver_2020
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich hätte da noch folgende, schöne Lösung als globale Funktion:

    function Arbeitstage(a : date,b : number) do
     let Datum := date(number(a));
     let Tage := b;
     let Startdatum := Datum;
     if weekday(Datum) = 5 then
      Startdatum := Datum + 2
      end;
     if weekday(Datum) = 6 then
      Startdatum := Datum + 1
     end;
    let days := Tage;
    let Enddatum := Datum + Tage;
    while workdays(Startdatum, Startdatum + days) < Tage do
     days := days + 1
    end
    ;
    Enddatum := Startdatum + days;
    Enddatum
    end

    Ein Zieldatumsfeld könnte man mit folgendem Aufruf füllen:

    'Zieldatum' := date(number(Arbeitstage(Datum, Tage)))

    Wobei Datum = Datumswert des Startdatums und Tage natürlich nummerisch sind.

Content aside

  • 1 „Gefällt mir“ Klicks
  • vor 4 JahrenZuletzt aktiv
  • 33Antworten
  • 12047Ansichten
  • 1 Folge bereits