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 intervaloend date
: fecha final del intervalomethod
: 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;
