DATEMOV: Cómo cambiar la fecha a un punto importante

Cómo:

Idiomas disponibles: informes, Maintain

La función DATEMOV cambia la fecha a un punto importante del calendario.

Puesto que Dialogue Manager interpreta la fecha como alfanumérica o numérica, y DATEMOV requiere la presencia de una fecha estándar almacenada como desplazamiento de la fecha base, evite utilizar DATEMOV con Dialogue Manager, a menos que primero convierta la variable utilizada como fecha de entrada para un desplazamiento de la fecha base. Por ejemplo, en el ejemplo siguiente la fecha legacy de número entero, 20050131, se ha convertido a una fecha inteligente, se ha añadido un mes y el resultado se ha transformado a una fecha legacy alfanumérica:

-SET &STRT=DATECVT(20050131,'I8YYMD', 'YYMD');         
-SET &NMT=DATEADD(&STRT,'M',1);                        
-SET &NMTA=DATECVT(&NMT,'YYMD','A8MTDYY');             
-TYPE A MONTH FROM 20050131 IS &NMTA 

La salida indica que la función DATEADD ha añadido el número real de días del mes de febrero, para llegar al final del mes a partir del final de enero:

A MONTH FROM 20050131 IS 02282005

Para más información, consulte Cómo llamar a una función desde un comando de Dialogue Manager.

DATEMOV sólo funciona con fechas que incluyan todos los componentes.


Principio de página

x
Sintaxis: Cómo Cambiar una fecha a un punto importante
DATEMOV(date, 'move-point')

donde:

date

Fecha

Es la fecha que se va a cambiar. Debe ser una fecha de formato de componente completo (por ejemplo, MDYY o YYJUL).

move-point

Alfanumérico

Es el punto significativo al que se cambia la fecha, entre comillas simples ('). Al introducir un punto no válido, se obtiene un código de retorno de cero. Los valores válidos son:

  • EOM es el final del mes.
  • BOM es el principio del mes.
  • EOQ es el final del trimestre.
  • BOQ es el principio del trimestre.
  • EOY es el final del año.
  • BOY es el principio del año.
  • EOW es el final de la semana.
  • BOW es el principio de la semana.
  • NWD es el próximo día de la semana.
  • NBD es el próximo día laborable.
  • PWD es el día anterior de la semana.
  • PBD es el día laborable anterior.
  • WD- es un día de la semana o anterior.
  • BD- es un día laborable o anterior.
  • WD+ es un día de la semana o posterior.
  • BD+ es un día laborable o posterior.

Los cálculos de días laborables se ven afectados por las configuraciones de los parámetros BUSDAYS y HDAY.

Además, observe que, cuando la función DATEMOV calcula el próximo, o anterior, día laborable, siempre parte de un día laborable. Así que, si el día real es un sábado o un domingo y la solicitud desea calcular el próximo día laborable, DATEMOV toma el lunes (ni el sábado ni el domingo) como primer día laborable y devuelve el martes como siguiente día laborable. De forma parecida, cuando está calculando el anterior día laborable, emplea el viernes como día laborable inicial y devuelve el martes como anterior día laborable.

Para impedir que se salte un día laborable, use DATEMOV dos veces. Para volver al próximo día laborable, use BD- o WD- para pasar primero al día laborable anterior (si ya es un día laborable no se moverá). A continuación, vuelva a utilizar DATEMOV para pasar al próximo día laborable. Para volver al día laborable anterior, primero utilice BD+ o WD+ para pasar al próximo día laborable (si ya es un día laborable no se moverá). A continuación, vuelva a utilizar DATEMOV para pasar al día laborable anterior.

Nota: DATEMOV no usa un argumento output, sino que emplea el formato del argumento date para el resultado. Siempre que el resultado sea una fecha de componente completo, sólo podrá asignarse a un campo de fecha de componente completo o a un campo de número entero.



Ejemplo: Cómo devolver el próximo día laborable

Como indica el ejemplo, es posible que tenga que utilizar DATEMOV dos veces para obtener el resultado correcto.

La siguiente solicitud, basada en el origen de datos GGSALES, emplea el punto de movimiento BD (día laborable en sus siglas inglesas) sobre el campo DATE. Primero se convierte DATE a una fecha inteligente y, a continuación, se llama a DATEMOV con el punto-movimiento DB:

DEFINE FILE GGSALES  
DT1/WMDYY=DATE;                                                        
DT2/WMDYY = DATEADD(DT1 ,'BD',1);                                         
DAY/Dt = DT1;
 END                                                                       
 
TABLE FILE GGSALES                                                        
SUM  DT1 
DT2
BY DT1 NOPRINT
WHERE RECORDLIMIT EQ 10                                                 
 END  

En la salida, cuando la fecha caiga en sábado o domingo, el siguiente día laborable será el martes. Esto se debe a que antes de realizar el cálculo, DATEMOV ha pasado la fecha original al próximo día laborable:

  DT1              DT2   
  ---              ---         
  SUN, 09/01/1996  TUE, 09/03/1996
  FRI, 11/01/1996  MON, 11/04/1996
  SUN, 12/01/1996  TUE, 12/03/1996
  SAT, 03/01/1997  TUE, 03/04/1997
  TUE, 04/01/1997  WED, 04/02/1997
  THU, 05/01/1997  FRI, 05/02/1997
  SUN, 06/01/1997  TUE, 06/03/1997
  MON, 09/01/1997  TUE, 09/02/1997
  WED, 10/01/1997  THU, 10/02/1997

En la siguiente versión de la solicitud, DATEMOV ha sido llamada dos veces; la primera para comprobar que el día inicial es laborable. El punto de movimiento especificado en la primera llamada es DB-, que sólo desplaza la fecha al anterior día laborable si no es ya de por sí una fecha laborable. Después, la segunda llamada a DATEMOV usa el punto de movimiento BD para devolver el próximo día laborable:

DEFINE FILE GGSALES  
DT1/WMDYY=DATE;                                                        
DT1A/WMDYY=DATEMOV(DT1, 'BD-');                                           
DT2/WMDYY = DATEADD(DT1A,'BD',1);                                         
DAY/Dt = DT1;
 END                                                                       
 
TABLE FILE GGSALES                                                        
SUM  DT1 DT1A DT2
BY DT1 NOPRINT
WHERE RECORDLIMIT EQ 10                                                 
 END 

Ahora, el próximo día laborable después de un sábado o un domingo será el lunes:

DT1              DT1A             DT2   
  ---              ----             ---            
  SUN, 09/01/1996  FRI, 08/30/1996  MON, 09/02/1996
  FRI, 11/01/1996  FRI, 11/01/1996  MON, 11/04/1996
  SUN, 12/01/1996  FRI, 11/29/1996  MON, 12/02/1996
  SAT, 03/01/1997  FRI, 02/28/1997  MON, 03/03/1997
  TUE, 04/01/1997  TUE, 04/01/1997  WED, 04/02/1997
  THU, 05/01/1997  THU, 05/01/1997  FRI, 05/02/1997
  SUN, 06/01/1997  FRI, 05/30/1997  MON, 06/02/1997
  MON, 09/01/1997  MON, 09/01/1997  TUE, 09/02/1997
  WED, 10/01/1997  WED, 10/01/1997  THU, 10/02/1997


Ejemplo: Cómo determinar los puntos significativos de una fecha (Lenguaje de informes)

El parámetro BUSDAYS establece como días laborables el lunes, martes, miércoles y jueves. DATECVT convierte las fecha legacy HIRE_DATE al formato de fecha YYMD y proporciona opciones de visualización de fechas. A continuación, DATEMOV determina los puntos significativos de HIRE_DATE.

SET BUSDAY = _MTWT__
TABLE FILE EMPLOYEE
PRINT
COMPUTE NEW_DATE/YYMD = DATECVT(HIRE_DATE, 'I6YMD', 'YYMD'); AND
COMPUTE NEW_DATE/WT = DATECVT(HIRE_DATE, 'I6YMD', 'WT'); AS 'DOW' AND
COMPUTE NWD/WT = DATEMOV(NEW_DATE, 'NWD'); AND
COMPUTE PWD/WT = DATEMOV(NEW_DATE, 'PWD'); AND
COMPUTE WDP/WT = DATEMOV(NEW_DATE, 'WD+'); AS 'WD+' AND
COMPUTE WDM/WT = DATEMOV(NEW_DATE, 'WD-'); AS 'WD-' AND
COMPUTE NBD/WT = DATEMOV(NEW_DATE, 'NBD'); AND
COMPUTE PBD/WT = DATEMOV(NEW_DATE, 'PBD'); AND
COMPUTE WBP/WT = DATEMOV(NEW_DATE, 'BD+'); AS 'BD+' AND
COMPUTE WBM/WT = DATEMOV(NEW_DATE, 'BD-'); AS 'BD-' BY LAST_NAME NOPRINT
HEADING
"Examples of DATEMOV"
"Business days are Monday, Tuesday, Wednesday, + Thursday "
" "
"START DATE.. | MOVE POINTS..........................."
WHERE DEPARTMENT EQ 'MIS';
END

La salida es:

Examples of DATEMOV
Business days are Monday, Tuesday, Wednesday, + Thursday
START DATE.. | MOVE POINTS...........................
NEW_DATE    DOW  NWD  PWD  WD+  WD-  NBD  PBD  BD+  BD-
--------    ---  ---  ---  ---  ---  ---  ---  ---  ---
1982/04/01  THU  FRI  WED  THU  THU  MON  WED  THU  THU
1981/11/02  MON  TUE  FRI  MON  MON  TUE  THU  MON  MON
1982/04/01  THU  FRI  WED  THU  THU  MON  WED  THU  THU
1982/05/01  SAT  TUE  THU  MON  FRI  TUE  WED  MON  THU
1981/07/01  WED  THU  TUE  WED  WED  THU  TUE  WED  WED
1981/07/01  WED  THU  TUE  WED  WED  THU  TUE  WED  WED


Ejemplo: Cómo determinar el final de la semana (Lenguaje de informes)

DATEMOV determina el final de la semana de cada fecha situada en NEW_DATE y guarda el resultado en EOW:

TABLE FILE EMPLOYEE
PRINT FIRST_NAME AND
COMPUTE NEW_DATE/YYMDWT = DATECVT(HIRE_DATE, 'I6YMD', 'YYMDWT'); AND
COMPUTE EOW/YYMDWT = DATEMOV(NEW_DATE, 'EOW');
BY LAST_NAME
WHERE DEPARTMENT EQ 'PRODUCTION';
END

La salida es:

LAST_NAME     FIRST_NAME  NEW_DATE          EOW
---------     ----------  --------          ---
BANNING       JOHN        1982 AUG  1, SUN  1982 AUG  6, FRI
IRVING        JOAN        1982 JAN  4, MON  1982 JAN  8, FRI
MCKNIGHT      ROGER       1982 FEB  2, TUE  1982 FEB  5, FRI
ROMANS        ANTHONY     1982 JUL  1, THU  1982 JUL  2, FRI
SMITH         RICHARD     1982 JAN  4, MON  1982 JAN  8, FRI
STEVENS       ALFRED      1980 JUN  2, MON  1980 JUN  6, FRI


Ejemplo: Cómo determinar el final de la semana (Maintain)

DATEMOV determina el final de la semana de cada fecha:

MAINTAIN
COMPUTE X/YYMDWT='20020717';
COMPUTE Y/YYMDWT=DATEMOV(X, 'EOW', Y);
TYPE "<<X    <<Y  END OF WEEK "
END

El resultado es:

2002/07/17, WED   2002/07/19, FRI END OF WEEK

WebFOCUS