Skip to main content
Announcements
NEW: Seamless Public Data Sharing with Qlik's New Anonymous Access Capability: TELL ME MORE!
cancel
Showing results for 
Search instead for 
Did you mean: 
merry2018
Creator III
Creator III

Ermitteln der einzelnen Datums zwischen zwei Datums

Hallo Zusammen,

ich möchte die Tage zwischen einem Start- und Enddatum ermitteln. Also nicht einfach nur wissen wie viele es sind sondern die einzelnen Datums davon haben. 

Meine Tabelle sieht folgend aus: 

TeilArtStartterminEndtermin
AUrlaub02.03.1905.03.19
AUrlaub06.03.1906.03.19
AArbeit07.03.1907.03.19
AUrlaub08.03.1910.03.19
AArbeit11.03.1911.03.19
BUrlaub05.03.1905.03.19
BUrlaub06.03.1908.03.19

 

Und die zweite könnte z.b. folgend aussehen oder man kann es direkt mit z.b. interfallmatch generieren oder so, aber da komme ich eben noch nicht weiter. 

KALENDER

TagMonatJahr
01032019
02032019
03032019
04032019
05032019
06032019
07032019
08032019
09032019
10032019
11032019
12032019

 

Denn mein Ziel wäre gerne das ich wüsste das TEIL A

2.3.19Urlaub
3.3.19Urlaub
4.3.19Urlaub
5.3.19Urlaub
6.3.19Urlaub
8.3.19Urlaub
9.3.19Urlaub
10.3.19Urlaub
11.3.19Urlaub

 

Und überlegt hätte ich das man die Kalendertabelle z. b. an die erste Tabelle anbinden kann um dann filtern zu können an welchen Tagen genau denn Teil A Urlaub hat.

 

Ich wäre euch sehr dankbar, wenn jemand eine Idee hat und mir helfen könnte. 

Vielen Dank im voraus
Merry

Labels (4)
2 Solutions

Accepted Solutions
marcus_sommer

Es ist nicht wirklich ganz klar, wie jetzt die Datengrundlage aussieht und wie später gefiltert und gezählt werden soll. Gibt es in der Tabelle mit den Urlaubs-Daten auch Arbeits-Daten oder nicht? Wenn ja, sind diese auch vollständig (in Bezug auf die späteren Auswertungen) oder nicht? Falls eine der beiden Fragen Nein lautet, müssten diese Daten generiert werden.

Ich nehme mal, dass hier nur die Urlaubs-Daten drin sind. Das würde bedeuten, dass man vor den Urlaubstagen erstmal eine Datengrundlage für alle (entsprechenden) Kalendertage schaffen müsste. Das könnte z.B. per:

Grundlage: load Datum resident Kalender; join load Teil resident TeileListe;

geschehen. Alternativ ginge hier auch eine intervalmatch oder while Schleife über ein min/max Datum per Teil.

Persönlich wähle ich nahezu nie den intervalmatch (der Blog von HIC ist aber sehr gut, da er auch die dahinter liegende Logik sehr schön erklärt), sondern eine while-Schleife, mit der man dann eine Mapping-Tabelle erstellen könnte, wie:

map: load Teil & '|' & date(von + iterno() -1), 'Urlaub' resident UrlaubsListe while von + iterno() -1 <= bis;

und das mapped man dann in die finale Tabelle, z.B.:

Final: load *, applymap('map', Teil & '|' & Datum, 'Arbeit') as Type resident Grundlage;

- Marcus

 

View solution in original post

merry2018
Creator III
Creator III
Author

Also ich habe es noch hinbekommen und tatsächlich mit der While Variante und einem Join sowie Mapping.

Wer ähnliches Thema hat oder Lösung braucht, so habe ich es gelöst:

Kalender:
Load date($(varMinDatum)+iterNo()-1) AS Datum	
AUTOGENERATE (1)
WHILE $(varMinDatum)+iterNo()-1<= $(varMaxDatum);


Grundlage:
LOAD date(Datum) as Grundlage.Datum
Resident Kalender
;

Join LOAD Teil as Grundlage.Teil
Resident Arbeit_Urlaub;

Map:
Mapping LOAD
 Teil & '|' & if(Art ='Urlaub', date(DatumVon + IterNo() - 1) ),
 'U' 												
resident Arbeit_Urlaub
while DatumVon + IterNo()-1 <= DatumBis;
  
Final:
LOAD
	*,
	if(Final.Urlaub = 'U',1,0) as Final.UrlaubFlag
	;
LOAD Grundlage.Datum as Final.Datum,
	 Grundlage.Teil as Final.Mitarbeiter,
	ApplyMap ('Map', Grundlage.Teil & '|' & Grundlage.Datum,'F') as Final.Urlaub
Resident Grundlage;

 

Vielen Dank für eure Unterstützung.

Gruß Merry

View solution in original post

7 Replies
gerry_hdm
Creator II
Creator II

Hallo Merry

schau mal da rein rein  🙂

 

Es ist als nicht so leicht zu verstehen, was benötigt wird 🤔

Ich hoffe ich konnte dir mit der Datei Ansatzweise weiterhelfen.

Die Steps sind im Coding mal dokumentiert  ich hatte mal einen ähnlichen Fall

Gruß GErold

merry2018
Creator III
Creator III
Author

Hallo Gerold,

also ich glaub du hast mich fast verstanden, nur eins und zwar das ganze soll bei jedem Auftrag immer berechnet werden ohne das es ein Enddatum gibt, denn ich habe viele Aufträge welche in der Zukunft schon ihren Urlaub gebucht haben und ich möchte immer zusätzlich zum Start und Endtermin aufgelistet haben welche Tage dazwischen (Start- und Enddatum) Urlaub gebucht sind bei dem Auftrag.

 

Und bei deinem Beispiel fehlt jetzt z.b. auch der 7.3., der wird irgendwie nicht angezeigt als Urlaub.

 

Hast du dafür noch eine Korrekturmöglichkeit zu deinem Beispiel?

merry2018
Creator III
Creator III
Author

Hat Hierzu wirklich niemand eine Idee. Falls immer noch nicht klar ist was ich meine, hier nochmal ein Bsp.

Und zwar hat Teil A folgend Urlaub: "ARTEIT_URLAUB"

Artvonbis
Urlaub05.03.201908.03.2019
Urlaub07.05.201911.05.2019
Arbeit......

 

Womit ich als Ergebnis folgende Daten geliefert haben will: 

Urlaub05.03.2019
Urlaub06.03.2019
Urlaub07.03.2019
Urlaub08.03.2019
Urlaub07.05.2019
Urlaub08.05.2019
Urlaub09.05.2019
Urlaub10.05.2019
Urlaub11.05.2019

 

Andere Ansätze haben mir auch schon mit einem INTERVALLMATCH einen Weg zeigen willen, aber leider hat auch das nicht geklappt oder ich habe es falsch angewendet.

Oder hat dazu vielleicht jemand eine Idee warum das nicht gehen kann so:
INTERVAL:
Inner Join IntervalMatch(Art)
Load Distinct Von, Bis
resident ARTEIT_URLAUB;

marcus_sommer

Es ist nicht wirklich ganz klar, wie jetzt die Datengrundlage aussieht und wie später gefiltert und gezählt werden soll. Gibt es in der Tabelle mit den Urlaubs-Daten auch Arbeits-Daten oder nicht? Wenn ja, sind diese auch vollständig (in Bezug auf die späteren Auswertungen) oder nicht? Falls eine der beiden Fragen Nein lautet, müssten diese Daten generiert werden.

Ich nehme mal, dass hier nur die Urlaubs-Daten drin sind. Das würde bedeuten, dass man vor den Urlaubstagen erstmal eine Datengrundlage für alle (entsprechenden) Kalendertage schaffen müsste. Das könnte z.B. per:

Grundlage: load Datum resident Kalender; join load Teil resident TeileListe;

geschehen. Alternativ ginge hier auch eine intervalmatch oder while Schleife über ein min/max Datum per Teil.

Persönlich wähle ich nahezu nie den intervalmatch (der Blog von HIC ist aber sehr gut, da er auch die dahinter liegende Logik sehr schön erklärt), sondern eine while-Schleife, mit der man dann eine Mapping-Tabelle erstellen könnte, wie:

map: load Teil & '|' & date(von + iterno() -1), 'Urlaub' resident UrlaubsListe while von + iterno() -1 <= bis;

und das mapped man dann in die finale Tabelle, z.B.:

Final: load *, applymap('map', Teil & '|' & Datum, 'Arbeit') as Type resident Grundlage;

- Marcus

 

merry2018
Creator III
Creator III
Author

Ja es gibt in der Datenbank Arbeits- und Urlaubsdaten bis zum Datum heute und teilweise eben auch Urlaubsdaten für die Zukunft, auf welche der Hauptfokus bei der Auswertung liegt. Denn ich will ermitteln wer wann in der Zukunft Urlaub hat also wieviele in der Zukunftswoche X da sind oder nicht. 

Somit sind für die Tage bis heute alle Tage fortlaufend vorhanden, aber für die Zukunft eben nicht, da es für die Tage noch keine Arbeitstage gibt sondern nur die Urlaubstage. 

Kann ich das While-Mapping im Script auf die Arbeits/Urlaubstabelle anwenden oder gibt dies voraus das es separate Tabellen sind und auch die Teile separat notiert sind? 

Grüße
Merry

 

marcus_sommer

Ich denke, der wesentliche Punkt, ist die Generierung der fehlenden (Arbeits-) Daten bis zum Zeitpunkt X (vermutlich das Jahres/Perioden-Ende). Grundsätzlich sind da verschiedene Wege möglich, so könnte man z.B. die fehlenden Daten per concatenate an die Arbeits/Urlaubs-Tabelle anhängen und dann würde ein "einfacher" while-loop komplett ausreichen. Allerdings kann es schon etwas schwierig werden, diese Daten zu ermitteln, insbesondere wenn es mehrere Urlaubszeiträume in der Zukunft geben kann, da dann ein einzelnes/einfaches min/max über die Daten und/oder previous/peek wohl nicht mehr gehen wird.

Prinzipiell könnte man es schon so lösen, ich denke aber, dass alle diese Varianten deutlich aufwändiger/komplexer werden, als der gestern vorgeschlagene join-while-mapping Ansatz.

Probiere es doch einfach mal aus - am Besten in einer Dummy-Anwendung mit ein paar Inline- oder Excel-Datensätze, um die Logik und Ergebnisse schnell und einfach prüfen zu können. Wenn es dann funktioniert wie es soll, transferierst Du es einfach in die Zielanwendung.

- Marcus

merry2018
Creator III
Creator III
Author

Also ich habe es noch hinbekommen und tatsächlich mit der While Variante und einem Join sowie Mapping.

Wer ähnliches Thema hat oder Lösung braucht, so habe ich es gelöst:

Kalender:
Load date($(varMinDatum)+iterNo()-1) AS Datum	
AUTOGENERATE (1)
WHILE $(varMinDatum)+iterNo()-1<= $(varMaxDatum);


Grundlage:
LOAD date(Datum) as Grundlage.Datum
Resident Kalender
;

Join LOAD Teil as Grundlage.Teil
Resident Arbeit_Urlaub;

Map:
Mapping LOAD
 Teil & '|' & if(Art ='Urlaub', date(DatumVon + IterNo() - 1) ),
 'U' 												
resident Arbeit_Urlaub
while DatumVon + IterNo()-1 <= DatumBis;
  
Final:
LOAD
	*,
	if(Final.Urlaub = 'U',1,0) as Final.UrlaubFlag
	;
LOAD Grundlage.Datum as Final.Datum,
	 Grundlage.Teil as Final.Mitarbeiter,
	ApplyMap ('Map', Grundlage.Teil & '|' & Grundlage.Datum,'F') as Final.Urlaub
Resident Grundlage;

 

Vielen Dank für eure Unterstützung.

Gruß Merry