News Artikel Foren Join Projekte List Links Random Über Redscope Previous Next Startseite › Foren › Allgemeine Fragen zu SAS Differenz zweier Datumsangaben pro Eintrag 4 March, 2009 - 14:05 — cseidl Hallo liebe SAS-Gemeinde, ich stehe am Schlauch und brauch eine Lösung. Folgendes Problem: Kd Datum 1 21.01.2009 1 24.02.2009 1 26.02.2009 1 01.03.2009 2 06.04.2008 2 30.11.2008 2 31.12.2008 Ich benötige nun die Differenz zwischen den Datumsangaben pro Kunde um eine Verweildauer zu bestimmen. Dh zwischen 21.01.2009 und 24.02.2009, zwischen 24.02.2009 und 26.02.2009, usw. Meine Idee war es, die Einträge pro Kunde zu nummerieren, und dann die Datümer von einander abzuziehen, aber ich bekomm das nicht hin. Hat jemand eine Idee? Vielen Dank schon mal Caren Seidl Foren: Allgemeine Fragen zu SAS Log in or register to post comments Mit RETAIN die Daten "mitnehmen" 4 March, 2009 - 17:15 — Mario Hallo, vielleicht hilft das ja weiter. Ist zumindest das, was mir gerade einfiel und für das angegebene Beispiel funktioniert. /* Testdaten erstellen (entsprechend dem Beispiel). -------------------------------------------------------- */ PROC SQL; CREATE TABLE work.original (KD CHAR(1), Datum DATE); INSERT INTO work.original VALUES ('1','21JAN2009'd) VALUES ('1','24FEB2009'd) VALUES VALUES VALUES VALUES VALUES VALUES ('1','24FEB2009'd) ('1','26FEB2009'd) ('1','01MAR2009'd) ('2','06APR2008'd) ('2','30NOV2008'd) ('2','31DEC2008'd) ; QUIT; /* Variante 1: Mittels RETAIN das Datum aus der jeweils oberen (aber zur Kundennummer gehörenden) Zeile mitnehmen und anschließend die Differenz berechnen. -------------------------------------------------------- */ PROC SORT DATA = work.original; BY KD Datum; RUN; DATA work.variante1 (DROP = _:); SET work.original; BY KD Datum; RETAIN _retDatum; IF FIRST.KD THEN DO; _retDatum = Datum; END; ELSE DO; Verweildauer_Tage = INTCK('DAY',_retDatum,Datum); Verweildauer_Monate = INTCK('MONTH',_retDatum,Datum); _retDatum = Datum; END; RUN; /* Variante 2: Pro An- und Abreise (?) je einen Datensatz erstellen und anschließend die Differenz der beiden Tage berechnen. Hat den Vorteil, dass man eine optisch übersichtlichere Datenstruktur hat. -------------------------------------------------------- */ PROC SORT DATA = work.original; BY KD DESCENDING Datum; RUN; DATA work.variante2 (DROP = _: WHERE = (NOT MISSING(Datum_Abfahrt))); FORMAT KD $1. Datum_Ankunft Datum_Abfahrt DEUDFDD10.0; SET work.original (RENAME = (Datum = Datum_Ankunft)); BY KD DESCENDING Datum_Ankunft; RETAIN _retDatum; IF FIRST.KD THEN DO; _retDatum = Datum_Ankunft; END; ELSE DO; ELSE DO; Datum_Abfahrt = _retDatum; _retDatum = Datum_Ankunft; END; Verweildauer_Tage = INTCK('DAY',Datum_Ankunft,Datum_Abfahrt); Verweildauer_Monate = INTCK('MONTH',Datum_Ankunft,Datum_Abfahrt); RUN; PROC SORT DATA = work.variante2; BY KD Datum_Ankunft; RUN; Log in or register to post comments Mario, ich glaube, sie meint fortlaufende Differenzen: 30 March, 2009 - 17:27 — Norbert.R DATA temp1; INPUT KD Datum ddmmyy10.; CARDS; 1 21.01.2009 1 24.02.2009 1 26.02.2009 1 01.03.2009 2 06.04.2008 2 30.11.2008 2 31.12.2008 ; DATA temp2 (KEEP = KD Diff_Tage); RETAIN Datum; Old_Datum = Datum; SET temp1; BY KD; IF FIRST.KD THEN DELETE; ELSE Diff_Tage = DATDIF(Old_Datum,Datum,'act/act'); RUN; PROC PRINT NOOBS; RUN; Das ergibt: KD Diff_ Tage 1 1 1 2 2 34 2 3 238 31 Log in or register to post comments Danke Super. Vielen Dank. Hab mir eine notdürftige Lösung gebastelt, aber so ist besser. Danke Viele Grüße Caren Seidl Log in or register to post comments 8 March, 2009 - 16:11 — cseidl