Alter berechnen mit Base SAS

Ähnliche Dokumente
Hallo Jessi, wenn ich das. DATA aufg3_b; vari='<.0001'; IF &wil_two_test. le vari THEN pwert=0.0001;

Jede Kombination von 7 Spalten erzeugen

Ansprechen einer Anzahl von Variablen über einen Schleifendurchlauf

Spalten aufsummieren?!

Mehrere Datensätze zu einem Datensatz zusammenführen

Wie kann ich die Ausgabe als Excel speichern?

QMF Tabelle Q.OBJECT_DATA in DB2

Zeit-Macro-Variablen, passend zu einem Tag

Hilfe bei Programmierung mit SAS

Fehlermeldung, wenn Anzahl der %do der %end entspricht - was läuft falsch?

Zeilen in SAS-Datensatz einfügen

Änderung der Ordnung der Variablen in den SAS Datensatz

rechtsbündige Leerzeichen mit einlesen im Datastep

Berechnung der Dauer eines SAS Makros?

Umbenennung von Spaltennamen über Schleife(n)

Import von Text-Dateien. Einzelne Wörter einlesen.

zusammenfassen von Text variablenin einer Variable bei unterschiedlicher Variablenanzahl

Allman-Einrückungsstil versus 1TBS bei SAS-Base-Programmen

viele ähnliche Datensätze automatisch einlesen

Kreuztabelle als Data-Set so wie aus proc tabulate

Auslesen von SAS Systeminformationen über die aktuelle Log- Ausgabe

Formatierung beim Einlesen

Dynamisch Makros aufrufen

Merge mit nicht eindeutigen by-variablen

Berechnung der Arbeitstage

SUBSTRING - wo liegt mein Fehler?

ODS RTF Titel in Spalten linksbündig darstellen

SAS BASE LOG Fragen. Antwort, Teil 1

IMPORT / EXPORT Access

Macro erzeugt Dateifilter

Einlesen von Textdateien mit sehr langen Zeilen

Ermittlung der übereinstimmenden Variablen (-Namen) zweier Datasets

Exportieren in excel sheets

EG 4.2: Pfade zu verlinkten SAS-Files als relative Pfade speichern!?

Zugriff aus Oracle via Proc SQL: Performanceprobleme

Excel sheet input / Zufallsgenerator/ Excel sheet output

News Artikel Foren Projekte Links Über Redscope

Wie überprüfen, ob eine Datei existiert?

Performance von SAS Anwendungen optimieren!?

Dateien trennen und zusammenfügen

Achsenbeschriftung um 90 drehen

SAS Daten per Remote SUBMITE vom Großrechner selektieren,

Der SAS DataStep und die Prozedur SQL Cellent Finance Solutions GmbH Seite: 1

SPDS-Problem - proc summary auf View mit by-variable - Sortierung wird verlangt

Umsetzen des signifikanten Rundens in SAS

Anhang zur Frage Data statement und Proc Statement

Schöne neue Welt. So können Sie fehlende SAS-Funktionalitäten mit PROC FCMP nachrüsten. SAS Treff 13. Juni 2013

Failed to transcode data from U_UTF8_CE to U_LATIN9_CE?!

Tücken bei der Erstellung von Zufallszahlen mit RANUNI

Import von XLS-Dateien aus einem Ordner in eine SAS-Datei

NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL

Makro zum Auffinden mehrfach vergebener Schlüsselnummern

Explain verstehen. Hans-Jürgen Schönig.

PSTricks. pst-gannt. Gannt charts; v.0.2. May 13, Herbert Voß

PROC GCHART HBAR Zeilenumbruch in Achsenbeschriftung

SAS-Online Dokumentation: zu finden über Internetsuche nach sas online documentation

Frage zu Markoschleife und PROC SQL

spezielle Summen bilden und proc corr

MySQL Queries on "Nmap Results"

C) SETTING THE DAY AND TIME (HOUR, 24 HOUR, MINUTE AND SECOND) The hour, 24 hour, minute, second and day are set by the same operation.

Bash-Skripting Linux-Kurs der Unix-AG

Einführung in die Praktische Informatik. Übungsblatt 3. PD Dr. U. Köthe Heidelberg, 7. November Aufgabe 3.1 Gaußsche Osterregel [6 Punkte]

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

Funktionen in Python

SAS Metadatenmanagement Reporting und Analyse

Kalenderrechnen. Olaf Schimmel 13. November 2015

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

THEMA: GUT VORBEREITET IST HALB ZERTIFIZIERT ANTWORTEN ZUR SAS VISUAL ANALYTICS-ZERTIFIZIERUNG" THOMAS WENDE

C. Ortseifen: Reguläre Ausdrücke

THEMA: SAS STORED PROCESSES ALS WEB-/REST-SERVICE AUFRUFEN" BRUNO MÜLLER

Objektrelationale, erweiterbare Datenbanken WS 04/05

Informatik B von Adrian Neumann

Laufzeitoptimierung bei der Verknüpfung großer Datenmengen Ein Vergleich zwischen MERGE und JOIN

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

X83-Konverter Instructions

Tipps & Tricks. Carina Ortseifen Ruprecht-Karls-Universität Heidelberg. Andreas Krebs icasus. Grischa Pfister icasus. Makrosprache

Data2Office: Eine neue Methode der SAS-Datenpräsentation in MS-Excel

C/C++-Programmierung

THEMA: SAS DATUMSWERTE: ERSTELLEN EIGENER DATUMSFORMATE LEICHT GEMACHT" EVA-MARIA KEGELMANN

1. Aufgabenstellung. 2. Methoden der Auswertung. 2.1 Die Theorie: κ - von Karman Konstante (0,4)

Effiziente Algorithmen

Erstellen von Dateilisten - Erfasssen von Dateiattributen

1 def Anweisung. 2 Argumentübergabe. 3 Lokale Variablen. 4 Default Argumente. 5 Aufruf mit Schlüsselwort. 6 Variable Argumente. Funktionen in Python


Transkript:

News Artikel Foren Projekte Links Über Redscope Join List Random Previous Next Startseite Foren ETL & Base SAS Alter berechnen mit Base SAS 26 October, 2008-21:31 ChrisLemberg Hallo Community, hoffentlich erscheint mein Beitrag dieses Mal und verschwindet nicht wieder im Nirvana. Ich habe eine relativ simple Frage, die ich mir selbst nicht beantworten kann, da ich hoffentlich nur den Wald vor lauter Bäumen nicht sehe... Ich habe ein Geburtsdatum, das in einer Oracle-Tabelle steht. Von diesem Geburtstag will ich nun das aktuelle Alter ableiten, was ja unter anderem mit Systemdatum - Geburtsdatum funktioniert. Das Resultat dieser Operation sind dann Tage?! Gibt es eine kleine Lösung um das ganze mit Base zu programmieren oder gibt es etwa eine Funktion, die mir das Ergebnis liefert? Christopher Foren: ETL & Base SAS Alter-Berechnung in einer Base-Zeile Hallo Christopher, es gibt eine kleine Lösung: 26 October, 2008-21:47 HansKneilmann

%macro age1( _BIRTH, _DATE ); /---------------------------------------------------------------- Macro: age1 Berechnung des Alters in Jahren, abh. von vorgebenen Datum "_DATE" see also: SAS communications, 4Q1998, Chapter???, page 38, "Accurately calculating age in only one line" by William Kreuter Beispiel für Macro "age1": ======== data xxx; age1=%age1( '28dec1956'd, '27dec1999'd ); age2=%age1(input("19561228", yymmdd8.), '27dec1999'd ); age3=%age1(input("19561228", yymmdd8.) ); "heut proc print data=xxx; see also: www.sas.com > Service and Support > Technical Tips (20010 http://www.sas.com/service/techtips/quicktips/calcage.html Quick Tip: "Accurately calculating age with only one line of by William Kreuter ---------------------------------------------------------------/ %if &_DATE. eq %then %let _DATE="&sysdate."d; floor( (intck( 'month', &_BIRTH., &_DATE.) - ( day(&_date.) < day(&_birth.) ) ) / 12 ) %mend age1; Es gibt (natürlich) auch noch eine zweite Lösung:

%macro age2( _BIRTH, _DATE ); /---------------------------------------------------------------- Macro: age2 Berechnung des Alters in Jahren, abh. von vorgebenen Datum "_DATE" see also: www.sas.com > Service and Support > Technical Tips (20020 http://www.sas.com/service/techtips/quicktips/age_0302.html Quick Tip: "Calculating age in Years and Days" by Venky Chakravarthy Beispiel für Macro "age2": ======== data dates; retain birth "02jan2001"d; do refer = "31dec2001"d, "01jan2002"d, "02jan2002"d, "03jan2002 output; data _null_; set dates; %age2(birth, refer ); put age = "Years and " days "days"; ---------------------------------------------------------------/ %if &_DATE. eq %then %let _DATE="&sysdate."d; age = int (yrdif(&_birth., &_DATE., 'actual')); days = datdif(mdy(month(&_birth.),day(&_birth.), year(&_date.)), &_DAT if days < 0 then do; days = datdif(mdy(month(&_birth.),day(&_birth.), year(&_date.)-1), & %mend age2; Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Einfacher? Hallo, 27 October, 2008-02:16 Kotulla geht das nicht auch einfacher: alter=int(yrdif(gebtag,today(),'actual') bzw. alter=intck('year',gebtag,today()) Thomas Einfach aber falsch 28 October, 2008-16:23 HansKneilmann

Hallo, natürlich geht es auch einfacher, aber das Problem der Alters-Berechnung liegt im Detail. Beispiel: Ich habe erst am 28. Dezember Geburstag (genau 28.12.1956). Bin ich schon 52 Jahre alt? Oder noch 51 Jahre? Die Antwort ist klar: Ich bin noch 51 Jahre alt. Die o.a. Lösung meint aber ich wäre schon 52 Jahre alt: data dates; retain birth "28dec1956"d; do refer = today(), '27dec2008'd, '28dec2008'd, '29dec2008'd ; output; data _null_; set dates; put " " ; age=%age1( birth, refer ); put "INFO: age1: " age = "Years "; %age2( birth, refer ); put "INFO: age2: " age = "Years and " days "days"; alter=int(yrdif(birth,refer,'actual')); put "INFO: age3: " alter = "Jahre"; alter=intck('year',birth,refer); put "INFO: age4: " alter = "Jahre"; liefert folgende (teilweise falschen) Ergebnisse: INFO: age1: age=51 Years INFO: age2: age=51 Years and 307 days INFO: age3: alter=51 Jahre INFO: age1: age=51 Years INFO: age2: age=51 Years and 365 days INFO: age3: alter=51 Jahre INFO: age1: age=52 Years INFO: age2: age=52 Years and 0 days INFO: age3: alter=52 Jahre INFO: age1: age=52 Years INFO: age2: age=52 Years and 1 days INFO: age3: alter=52 Jahre Die einfache Lösung aus dem obigen Beitrag von Kotulla (27. Oktober 2008, 2:16) liefert m.e. oft eine falsche Lösung. Die Macros age1 und age2 aus meinem Beitrag (HansKneilmann,26. Oktober 2008, 21:47) liefern (bei diesen Test-Werten) jedesmal das korrekte Alter. Gruß

Hans Kneilmann, Schäfer Shop GmbH (SSI) Hans Kneilmann, Schäfer Shop GmbH (SSI) Hallo Herr Kneilmann, vielen Hallo Herr Kneilmann, 28 October, 2008-16:47 Kotulla vielen Dank für diese Ausführung. Dann werde ich mir das auch einmal speichern. Thomas Hallo, ich möchte Hallo, 13 August, 2009-13:45 Chris86 ich möchte anschließend zu dem Thema noch eine Frage aufwerfen: Gibt es auch ein Makro, dass die Altersberechnung wie %age2(geb,heute) realisiert, nur auch die Schaltjahre mit einbezieht? data dates; retain birth "29feb2000"d; do refer = "28feb2003"d, "01mar2003"d, "28feb2008"d, " output; data _null_; set dates; %age2(birth, refer ); put age = "Years and " days "days"; Alter wenn Geburtstag am Schalttag 14 August, 2009-10:40 HansKneilmann Hallo Herr Knoll, wenn die Frage sich nur auf das Alter bezieht ist die Antwort ganz einfach: Ja es gibt ein Makro, dass die Altersberechnung realisiert und auch die Schaltjahre mit einbezieht, nämlich age=%age1( birth, refer );. Ungefähr so:

data dates; retain birth "29feb2000"d; do refer = "28feb2003"d, "01mar2003"d, "28feb2008"d, "29fe output; data _null_; set dates; age=%age1(birth, refer ); put age = "Years "; Die Ausgabe ist age=2 Years age=3 Years age=7 Years age=8 Years und damit korrekt (oder?) Nachtrag (14. August 2009, 10:40) Das Problem bei %age2( birth, refer ); liegt in dem Versuch das Alter tages-genau auszurechnen. Dabei ist aber das Problem, wohin man die Geburttags-Feier verschiebt wenn geerade kein Schaltjahr ist. Und passend zur verschobenen Geburttags-Feier kann man dann die Tages-Differenz zu refer (oder zu heute oder zu...) ausrechnen. Im Macro %age2( birth, refer ); wird einfach (und ungeprüft) der Tag und der Monat vom (Original-)Geburtstag auf die Folgejahre übertragen... Und im Jahr 2003 (erster Test-Fall) gibt es keinen 29.02., deshalb meldet SAS im LOG ganz korrekt NOTE: Invalid argument to function MDY at line 436 column 23. NOTE: Invalid argument to function DATDIF at line 436 column 16. Ende vom Nachtrag Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) PROC FCMP Hallo zusammen, 23 May, 2012-14:01 Tim_Taylor ich habe bzgl. der Altersberechnung zum erstenmal mit der relativ neuen PROC FCMP gespielt und mir eine Funktion "age" compiliert.

libname sasfuncs "/appdata/sas/.../func"; proc fcmp outlib=sasfuncs.funcs.global; function age(birth_date, curr_date); age=((intck('month',birth_date,curr_date)-(day(curr_date) < day(b return (age); endsub; Aufruf erfolgt dann so... options cmplib=sasfuncs.funcs; data test; bd="21jan1973"d; cd="20may2012"d; / Aufruf eigene Funktion age: age(birth_date, current_date) / alter=age(bd, cd); Vielleicht kann das jemand gebrauchen. Tim_Taylor