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
-
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, ",", " - ")
-
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 -
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
Content aside
- vor 2 JahrenZuletzt aktiv
- 6Antworten
- 188Ansichten
-
2
Folge bereits