Tratamiento de los campos fechas y cálculo de diferencias entre fechas

Trabajar con fechas en los diferentes ambientes de datos puede ser un reto importante, en SAS no es la excepción.

Hay que tener presente que el manejo de fechas en SAS es muy particular.  En primer lugar, SAS usa como fecha de referencia para el conteo el 01-01-1960, a diferencia de otros sistemas de manejo de datos que utiliza el 01-01-1900.  En segundo lugar, los campos fechas son diferentes a los campos fecha/hora, algo que es diferente a los manejadores de bases de datos, en donde fecha y fecha/hora son equivalentes.

Teniendo en cuenta esto, para los campos que son fechas el valor que se almacena son números consecutivos, que si son positivos son los dias posteriores al 01-01-1960, y los valores negativos son valores anteriores a esa fecha de referencia.

Para el caso de campos fecha/hora, el valor que se almacena son números consecutivos (positivos o negativos) que representan los segundos transcurridos desde el 01/01/1960 a las 00:00:00.

Los campos fecha que se obtienen desde bases de datos, siempre serán desplegados y tratados como fecha/hora.  Si se quiere transformar un campo fecha/hora a un campo fecha se debe usar la función datepart, con la siguiente sintaxis

datepart(datetime)

Ahora bien, cómo calculamos intérvalos entre fechas.  La forma más fácil es la artimética de fechas, es decir, sumar o restar fechas, y el resultado de esa operación es la cantidad de días entre esas fechas.  Pero este tipo de artimética puede tener ciertas imprecisiones. 

SAS tiene una cantidad importante de funciones para el manejo de fechas, entre ellas la función INTCK que permite calcular la diferencia entre dos fechas.  Esta función puede usarse en distintos contextos de programas en SAS, ya sea DATA Step o PROC SQL.  La sintaxis de la función INTCK es la que sigue

INTCK (interval, start date, end date, method)

    • interval: intérvalo para calcular (day, week, month, quarter, year)
    • start date: fecha inicial del intervalo
    • end date: fecha final del intervalo
    • method: este argumento es opcional. Los intérvalos son contados usando un método discreto (D) o continuo (C).

El parámetro interval tiene los siguientes valores

Intervalo Descripción
DAY Dias
DAY3 Intervalos de 3 días
WEEK Semanas iniciando en domingo
WEEK.7 Semanas iniciando en sábado
WEEK.2 Semanas iniciando en lunes
WEEKDAY Semanas laborales de 5 días excluyendo sábado y domingo
WEEKDAY1W Semanas laborales de 6 días excluyendo sábado
SEMIMONTH Semestres
MONTH Meses
QTR Trimestres
YEAR Años

Ejemplos

Vamos a crear un dataset de ejemplo.  El dataset va a tener dos variables tipo texto.

data fechasbase;
    format Inicio_DT Fin_DT yymmddd10.;
    input Inicio_DT :date9. Fin_DT :date9.;
 datalines;
 01JUL2023 09SEP2023
 10MAY2023 21JUN2023 
 17JUL2023 04OCT2023
 11FEB2023 04DEC2023
 ;
run;

Cálcular el número de días, semanas y meses

Con la función INTCK y cambiando el parámetro interval, podemos realizar el cálculo de las diferencias de días, semanas y meses, como sigue en el siguiente programa:

/*Calculo de Diferencias*/
data w_calculos;
    set fechasbase;
    dias = intck('day', Inicio_DT, Fin_DT);
    semanas = intck('week', Inicio_DT, Fin_DT);
    meses = intck('month', Inicio_DT, Fin_DT);
run;

proc print data=w_calculos;
run;

Calcular número de días hábiles

También es posible calcular los días hábiles entre dos fechas especificando los intérvalos “weekday“.  Hay que tener en cuenta que esta diferencia no incluye feriados especiales que no son laborables, así que si quiere incluir estas fechas especiales, el programa debe ser más complejo, pero esto es tema de otro post.

      data w_calculos_habiles;
          set fechasbase;
          dias_laborales = intck('weekday', Inicio_DT, Fin_DT);
      dias_laborales6 = intck('weekday1w', Inicio_DT, Fin_DT);
      run;

      proc print data=w_calculos_habiles;
      run;

 

 

 

Tags: