0

Datums-Array: Aufeinanderfolgende Werte zusammenfassen

Hallo Community,

ich habe eine Tabelle, in der jeder Datensatz ein Datum hat. Nun möchte ich daraus Zeiträume auslesen bzw. erkennen, welche Datensätze zusammengehören (weil deren Datums-Werte aufeinander folgend sind).

Ich habe also einen Array wie diesen:

[01.12.2021,02.12.2021,03.12.2021,30.01.2022,31.01.2022,01.02.2022,...]

Daraus möchte ich auslesen:

Zeitraum 1: 01.12 - 03.12.
Zeitraum 2: 30.01 - 01.02.

Ich habe das mit einer for-Schleife versucht, komme aber auf keinen grünen Zweig...

Vielen Dank schon mal im Voraus!

6 Antworten

null
    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Knifflig. Falls hier jemand eine elegante Lösung hat, wäre ich neugierig. Mir ist nur Brutalcoding eingefallen;-). Mirko

    let dateArray := ((select TABELLE) order by Datum)[Datum != null].Datum;
    let cntAllDates := cnt(dateArray);
    let itemsOnBorder := for i in range(0, cntAllDates) do
            if item(dateArray, i) - 1 != item(dateArray, i - 1) or item(dateArray, i) + 1 != item(dateArray, i + 1) then
                text(item(dateArray, i))
            end
        end;
    let daysOnFullRange := days(date(item(dateArray, 0)), last(dateArray));
    let datesOnFullRange := for i in range(0, daysOnFullRange + 1) do
            text(date(item(dateArray, 0) + i))
        end;
    let datesInBetween := for x in datesOnFullRange do
            if not contains(concat(dateArray), x) then
                x
            end
        end;
    let replaceDatesInBetween := for i in datesOnFullRange do
            if contains(concat(datesInBetween), i) then
                "*"
            else
                i
            end
        end;
    let result := for i in replaceDatesInBetween do
            if contains(concat(itemsOnBorder), i) or i = "*" then
                i
            end
        end;
    let prettyResult := splitx(replacex(replace(concat(result), " ", ""), "(,\*)+", ","), ",,");
    let lastArray := join(for j in range(1, cnt(prettyResult) + 1) do
            "Zeitraum " + j + ": " + item(prettyResult, j - 1)
        end, "
    ");
    replace(lastArray, ",", " - ")
    
      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko Vielleicht eine andere Lösung etwas simpler gedacht:
      P.S. Habe von dir Variablenbezeichnungen geklaut. ;-)

      let P := ((select Tabelle4) order by Datum).Datum;
      if even(cnt(P)) then
          let vArray := [];
          let vZeitraum := [];
          let j := 1;
          for i in range(0, cnt(P)) do
              if even(i) then
                  vZeitraum := "Zeitraum " + j + ": " + item(P, number(i)) + " - " + item(P, number(i) + 1);
                  vArray := array(vArray, vZeitraum);
                  j := j + 1
              end
          end;
          let lastArray := join(vArray, ",");
          replace(lastArray, ",", "
      ")
      end

    • UweG
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Und noch etwas weniger Code und keine Variablenbezeichnung geklaut. ;-):

    let P := ((select Tabelle4) order by Datum).Datum;
    if even(cnt(P)) then
        let vArray := [];
        let vZeitraum := [];
        let j := 1;
        for i in range(0, cnt(P)) do
            if even(i) then
                vZeitraum := "Zeitraum " + j + ": " + item(P, number(i)) + " - " + item(P, number(i) + 1);
                vArray := array(vArray, vZeitraum);
                j := j + 1
            end
        end;
        replace(join(vArray, ","), ",", "
    ")
    end

    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hi Uwe. Das muß ich erst mal verarbeiten. An Arrays befüllen habe ich auch gedacht, da bin ich aber nicht erfolgreich gewesen. Noch differieren aber unsere Ergebnisse. Hier mal ein Screenshot mit den Daten meiner Testtabelle. Sieht so aus, als ob bei Deiner Formel noch nicht die Grenzdatumwerte genau getroffen sind. Aber vielleicht habe ich TEST-Benutzer auch falsch verstanden. Ich werde mir Dein Script heute Abend mal ansehen. Ich denke, da ist etwas zum Lernen für mich dabei. Gruß Mirko

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko Was ist bei dir mit dem 05.05.2022 und weiteren Daten wo das Enddatum im Zeitraum fehlt?
      Vielleicht habe auch ich die Fragestellung falsch verstanden, was mir häufiger passiert.
      Ich ging davon aus, dass aus dem Datums-Array (wenn aufsteigend sortiert) immer Datumspaare extrahiert werden sollen. Dem ersten Datum im Array wird also das direkt folgende Datum als Enddatum dieses Zeitraums zugeordnet. Und so setzt es sich fort.
      Deshalb Arbeit ich mit even() in der Schleife.
      Arrays beginnen immer mit 0, deshalb ist das Startdatum immer eine gerade Item-Zahl und das Nachfolgedatum (ungerade Item-Zahl) als Enddatum des Zeitraums.
      Wenn das gesamte Array eine ungerade Anzahl an Item's hat wird bei mir das Script nicht ausgeführt, da ein Zeitraum nicht bestimmt werden kann, wenn ein Enddatum fehlt.
      Das kann man sicherlich im Script abfangen und eine Meldung wie "Enddatum fehlt"  in diesem Zeitraum reinschreiben. Da war ich wohl etwas rigoros, was das Scripting betrifft.
      Aber vielleicht ist eine der von uns angebotenen Lösungsvorschläge ja genau das, was TEST-Benutzer sich erhofft.
      Mit den Array's war ich zu Anfang auch unsicher. Aber mit dem Anwenden von Carbone und neuerdings den GAEB-Dateien, die nach dem parsen ein einziges Mischmasch aus JSON-Objekten und Array's sind, bekommt ich immer mehr Sicherheit und Kreativität in meiner Denke.

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko Du hast Recht. Ich habe es falsch verstanden und mein Lösungsansatz nicht zutreffend.

Content aside

  • vor 1 JahrZuletzt aktiv
  • 6Antworten
  • 155Ansichten
  • 2 Folge bereits