Tratamiento de fechas en SAS (modulo BASE)

Es habitual la necesidad de obtener diferencias entre fechas para realizar validaciones o ejecuciones condicionadas en los procesos. A continuación un sencillo ejemplo que obtiene diferencias entre fechas en diferentes unidades (días, meses, años) y realiza desplazamientos partiendo de una fecha determinada.

Así mismo, un paso data de ejemplo que obtiene todos los días de un mes determinado.

data funciones_f;
length fecha1_num fecha2_num 8.;
fecha1_num = 20121001;
fecha2_num = 20131001;
fecha_h_date = today();
run;

data funciones_f_01(drop = fecha_h_date_suma_1dia fecha_h_date_suma_1mes fecha_h_date_suma_1anyo );
set funciones_f;

/* Transformamos las variables numérica con contenido fecha yyyymmdd a variable tipo fecha */
fecha1_date = mdy((mod((int(fecha1_num/100)),100)),(mod(fecha1_num,100)),(int(fecha1_num/10000)));
fecha2_date = mdy((mod((int(fecha2_num/100)),100)),(mod(fecha2_num,100)),(int(fecha2_num/10000)));

/* Partiendo de una variable tipo fecha que contiene la fecha del día, la convertimos en un
numérico con formato yyyymmdd */
fecha_h_num = input(put(fecha_h_date,yymmddn8.),8.);

/* Obtenemos diferencias entre fechas en días, meses y años */
dif_dias=intck('day',fecha1_date,fecha2_date);
dif_dias_lab = intck('weekday',fecha1_date,fecha2_date); /* Diferencia de días, en días laborables */
dif_meses=intck('month',fecha1_date,fecha2_date);
dif_años=intck('year',fecha1_date,fecha2_date);

/* Desplazamos la fecha del día en una unidad: días, meses o años */
fecha_h_date_suma_1dia = intnx('day',fecha_h_date,1);
fecha_h_num_suma_1dia = input(put(fecha_h_date_suma_1dia ,yymmddn8.),8.);
fecha_h_date_suma_1mes = intnx('month',fecha_h_date,1);
fecha_h_num_suma_1mes = input(put(fecha_h_date_suma_1mes ,yymmddn8.),8.);
fecha_h_date_suma_1anyo = intnx('year',fecha_h_date,1);
fecha_h_num_suma_1anyo = input(put(fecha_h_date_suma_1anyo ,yymmddn8.),8.);

/* Obtener el día, mes y año de la fecha del día */
dia_h = day(fecha_h_date);
mes_h = month(fecha_h_date);
anyo_h = year(fecha_h_date);

/* Partiendo de la fecha del día en formato fecha-hora, dividir en fecha y hora */
datetime_h = datetime();
date_h = datepart(datetime_h);
time_h = timepart(datetime_h);
format date_h date9. datetime_h datetime. time_h time.;
run;


/* Obtener todos los días de un mes */
%let mes = 201309;
data funciones_f_m (keep = dia_mes) ;
dia_ini = &mes.01;
i = 0;
val_mes = 1;
dia_mes_ini = mdy((mod((int(dia_ini/100)),100)),(mod(dia_ini,100)),(int(dia_ini/10000)));
do while (val_mes = 1);
    dia_mes_aux = intnx('day',dia_mes_ini,i);
    i = i + 1;
    dia_mes = input(put(dia_mes_aux ,yymmddn8.),8.);
    if round(dia_mes/100) = &mes. then do;
        val_mes = 1;
        output;
    end;
    else do;
        val_mes = 0;
    end;   
end;
run;

 

https://www.youtube.com/@datademyformacion6610