martes, 8 de abril de 2014

Macros transformación fechas SAS (II)

Seguimos con la serie de posts sobre macros útiles en el tratamiento de fechas.




En este post incluímos tres macros:
inicio_mes: devuelve el primer día del mes de una fecha dada.
fin_mes: devuelve el último día del mes de una fecha dada.
dia_semana: devuelve el dia de la semana de una fecha dada.


%macro inicio_mes(fec);
/* Como parametro recibe una fecha*/
/* Devuelve la fecha del primer dia del mes de esa fecha*/
%put fec = &fec.;
intnx("month",&fec.,0)
%mend;

%macro fin_mes(fec);
/* Como parametro recibe fecha*/
/* Devuelve la fecha del ultimo dia del mes de esa fecha*/
intnx("month",&fec.,1)-1
%mend;

%macro dia_sem(fec);
/* Como parametro recibe fecha */
/* Devuelve el día de la semana */
%global dia_semana;
%let dia = %sysfunc(weekday(&fec.));

%if &dia = 1 %then %let dia_semana =  "DOMINGO";
%else %if &dia = 2 %then %let dia_semana =  "LUNES";
%else %if &dia = 3 %then %let dia_semana =  "MARTES";
%else %if &dia = 4 %then %let dia_semana =  "MIERCOLES";
%else %if &dia = 5 %then %let dia_semana =  "JUEVES";
%else %if &dia = 6 %then %let dia_semana =  "VIERNES";
%else %if &dia = 7 %then %let dia_semana =  "SABADO";

&dia_semana
%mend;

/* Ejecución */

data test;
fec=date();
run;

data test1;
set test;                      
dia_semana = %dia_sem(fec);
fec1 = %inicio_mes(fec);
fec1_num = INPUT(PUT(fec1,yymmddn8.),8.);
fec2 = %fin_mes(fec);
fec2_num = INPUT(PUT(fec2,yymmddn8.),8.);
run;

4 comentarios:

  1. Muy útiles las macros.
    Te voy a pedir ayuda. Necesito acceder desde SAS a una BBDD Access que tengo en local. No sé cómo hacerlo, lo estoy intentando con la sentencia 'libname'.
    ¿Sabes si es posible?
    Gracias,

    ResponderEliminar
  2. Create un fichero odbc 'origen_odbc_bbdd' que apunte a tu BBDD Access.

    Después puedes realizar la siguiente libname:

    libname datos odbc dsn=origen_odbc_datos user=user password=password;

    También hay un componente llamado SAS ODBC server que te permite hacerlo de forma más intuitiva.

    Un saludo,

    ResponderEliminar
  3. Hola yo tengo un problema hago consultas a bases de teradata el formato en el que sale en sas es date9. pero si quiero extraer el mes y año no pueo ayuda!!! por favor

    ResponderEliminar
  4. Respondiendo a la consulta bases de datos Teradata(unknown):

    Si quieres extraer el mes en SAS, utiliza función month:

    data test;
    campomes = month(date());
    campoanyo = year(date());
    anyomes = compress(campoanyo)||compress(campomes);
    call symput('anyomes',anyomes);
    run;

    Si tienes que hacer la transformación en teradata utiliza la función cast. Te paso un ejemplo de conexión sas a teradata para obtener datos a partir de una fecha dada, utilizando la función cast de Teradata:

    proc sql;
    CONNECT TO teradata AS MYCOM (user="" password="" server=);
    CREATE TABLE tabla_teradata as
    select * from connection to MYCOM
    (
    select * from esquema_teradata.tabla_teradata
    where CAST(FECHA_TABLA_TERADATA AS DATE FORMAT 'YYYYMMDD') >= %str(%')&anyomes.01%str(%')
    );
    quit;

    Dime si esto te sirve o precisa un poco más tu pregunta, please.
    Ánimo,

    ResponderEliminar