Differenz zweier Datumsangaben pro Eintrag

Werbung
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
Herunterladen