Macros SAS. Primer y último día del mes de una fecha SAS

23 Dic

Me debo a vosotros, mis lectores. Y he tenido visitas que buscaban como obtener el primer y el último día de un mes con SAS. Como Análisis y Decisión es una web personalizada voy a dar respuesta a esas búsquedas. Para ello tengo os planteo dos macros de SAS, además nos servirán para entender mejor la función INTNX para operar con fechas. El siguiente ejemplo parte de la necesidad de obtener, dada una fecha, el primer y último día del mes de la fecha dada:

data _null_;
format x y z date9.;
y="12JUN08"d;
*ULTIMO DÍA DEL MES EN FUNCION DE LA FECHA;
x=intnx("month",y,1)-1;
put x;
PRIMER DÍA DEL MES EN FUNCION DE LA FECHA;
z=intnx("month",y,0);
put z=;
run;

Vemos que la función intnx opera como base en meses. Para obtener el último día sumamos un mes a nuestra fecha de referencia y le restamos un día. Es importante reseñar que intnx suma un mes, pero no suma días, es decir, nos sitúa en el primer día del mes siguiente a nuestra fecha. Con este razonamiento si sumamos 0 meses nos pondrá en el primer día del mes que operamos. Curioso funcionamiento el de esta función…

Pues bien, ahora hemos de generar una función, una macro que nos realice este cálculo, nos podría permitir obtener el número de días transcurridos del mes (por ejemplo). La macro, muy sencilla, queda:


%macro finmes(fec);
intnx("month",&fec.,1)-1
%mend;
%macro inimes(fec);
intnx("month",&fec.,0)
%mend;

Como ejemplo de uso:

data _null_;
 fecha="06APR09"d;
 finmes=%finmes(fecha);
 inimes=%inimes(fecha);
 format finmes inimes ddmmyy10.;
 put finmes inimes;
run;

«Mira que es fácil» estaréis pensando muchos, y tenéis mucha razón. La función INTNX es lo que tiene. Como ejercicio os propongo que hagáis esta función con meses en formato AAAAMM típicos de las tablas particionadas Oracle. Por supuesto, si tenéis dudas o un trabajo bien remunerado en una empresa capaz de afrontar un periodo de crisis de 6 semestres… rvaquerizo@analisisydecision.es

5 respuestas a «Macros SAS. Primer y último día del mes de una fecha SAS»

  1. Pingback: Bucle de fechas con SAS para tablas particionadas | Análisis y Decisión

  2. Buenas,

    Añadiendo un poco más de miga a estos casos, me pregunto cómo podría calcularse el último día hábil o el primer día hábil del mes. Esto es, me pregunto cómo podemos sacar el último día laborable de fin de mes o bien el primer día laborable de principios de mes.

    Gracias y Saludos!

  3. Que tal, antes que todo agradezco toda la ayuda que nos brinda, en lo personal me ha sido de mucha utilidad éste foro. Paso a mi cuestionamiento. Requiero meter el código de el último día del mes en una macrovariable, pero si lo hago con un %sysfunc no me reconoce la operación aritmética de restarle un día a la fecha obtenida, y si lo hago con un %eval lo único que consigo es que me la envíe como un número, pero necesito la envíe en formato yymmddn8.
    %let fh_cierre=%sysfunc(intnx(month, %sysfunc(today()),0)-1, yymmddn8.) ; /*no reconoce la operación aritmética*/

    %let fh_cierre=%eval(%sysfunc(intnx(month, %sysfunc(today()),0))-1) ; /*realiza la operación pero el resultado lo envía como número*/

    ¿Cómo puedo hacer que reconozca la operación aritmética y al mismo tiempo arroje el resultado en el formato que requiero?

    Nuevamente Gracias. Saludos.

  4. Hola buenos dias.
    si para el mismo ejemplo requiero cambiar «12JUN08,d» lo requiero cambiar por la fecha del día de hoy, es decir, con un date por ejemplo
    como podría hacer esta modificación?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *