DATEMOV: Como Mover uma Data para um Ponto Importante

Como:

Linguagens Disponíveis: Reporting, Maintain

A função DATEMOV move uma data para um ponto significativo no calendário.

O Dialogue Manager interpreta uma data como alfanumérica ou numérica e o DATEMOV exige uma data padrão armazenada como um desvio da data base, portanto, não utilize o DATEMOV com o Dialogue Manager a não ser que você primeiro converta a variável utilizada como a data de entrada em um desvio da data base. Por exemplo, as seguintes informações convertem a data inteira de legado 20050131 em uma data inteligente, adiciona um mês e converte o resultado em uma data de legado 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 

A saída mostra que a função DATEADD adicionou o número real de dias no mês de fevereiro para chegar ao fim do mês a partir do fim de janeiro:

A MONTH FROM 20050131 IS 02282005

DATEMOV funciona apenas com datas de componentes completas.


Topo da página

x
Sintaxe: Como Mover uma data para um ponto importante
DATEMOV(date, 'move-point')

onde:

Data

Data

É a data a ser movida. É necessário ser uma data de formato com todos os componentes (por exemplo, MDYY ou YYJUL).

move-point

Alfanumérico

É o ponto significativo para o qual a data é movida entre aspas simples. Um ponto inválido resulta em um código de retorno de zero. Valores válidos são:

  • EOM, que é o fim do mês.
  • BOM, que é o início do mês.
  • EOQ, que é o fim do trimestre.
  • BOQ, que é o início do trimestre.
  • EOY, que é o fim do ano.
  • BOY, que é o início do ano.
  • EOW, que é o fim da semana.
  • BOW, que é o início da semana.
  • NWD, que é o próximo dia de semana.
  • NBD, que é o próximo dia útil.
  • PWD, que é o dia de semana anterior.
  • PBD, que é o dia útil anterior.
  • WD-, que é um dia de semana ou anterior.
  • BD-, que é um dia útil ou anterior.
  • WD+, que é um dia de semana ou posterior.
  • BD+, que é um dia útil ou posterior.

O cálculo de um dia útil é afetado pelas definições de parâmetros BUSDAYS e HDAY.

Observe também que quando a função DATEMOV calcula o dia útil ou de trabalho anterior ou posterior, sempre começa a partir de um dia útil ou de trabalho. Portanto, se o dia for sábado ou domingo e a solicitação desejar calcular o próximo dia útil, DATEMOV irá utilizar segunda-feira como o dia inicial, não sábado ou domingo, e irá exibir terça-feira como o próximo dia útil. De forma similar, ao calcular o dia útil anterior, sexta-feira será utilizada como o dia inicial e quinta-feira será exibida como o dia útil anterior.

Para evitar pular um dia útil ou de trabalho, utilize DATEMOV duas vezes. Para exibir o próximo dia útil ou de trabalho, utilize BD- ou WD- para, primeiramente, ir para o dia útil ou de trabalho anterior (se este já for um dia útil, nada acontecerá). Em seguida, utiliza DATEMOV novamente para ir para o próximo dia útil ou de trabalho. Se você desejar exibir o dia útil ou de trabalho anterior, primeiro, utilizar BD+ ou WD+ para ir para o próximo dia útil ou de trabalho (caso já seja o tipo correto de dia, não haverá alterações). Em seguida, utiliza DATEMOV novamente para retornar ao dia útil ou de trabalho anterior.

Observação: DATEMOV não utiliza um argumento output. Ele utiliza o formato do argumento date para o resultado. Enquanto o resultado for uma data de componente completa, ele poderá será atribuído apenas para um campo de data de componente completa ou para um campo inteiro.



Exemplo: Como Obter o Próximo Dia Útil

Este exemplo exibe o motivo dapossível necessidade de se utilizar DATEMOV duas vezes para obter o resultado correto.

A solicitação a seguir na fonte de dados GGSALES utiliza o ponto de movimento BD (dia útil) no campo DATE. Primeiramente, DATE é convertido em uma data inteligente. Em seguida, DATEMOV é chamado com o move-point BD:

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  

Quando a data cair em um sábado ou domingo na saída, o próximo dia útil é exibido como terça-feira. Isto ocorre porque, antes do cálculo, DATEMOV moveu a data original para um dia útil:

  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

Na versão a seguir da solicitação, DATEMOV é chamado duas vezes, uma delas para garantir que o dia de início seja um dia útil. O ponto de movimento especificado na primeira chamada é BD-, que apenas move a data para o dia útil anterior se esta não for um dia útil. A segunda chamada para DATEMOV utiliza o ponto de movimento BD para encontrar o próximo dia útil:

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 

Na saída, o próximo dia útil após umsábado ou domingo é exibido agora como segunda:

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


Exemplo: Como Determinar pontos Significativos para uma Data (Relatório)

O parâmetro BUSDAYS define os dias úteis como segunda, terça, quarta e quinta. DATECVT converte a data de legado HIRE_DATE no formato de data YYMD e fornece opções de exibição de data. DATEMOV, em seguida, determina os pontos significativos para 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

A saída é:

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


Exemplo: Como Determinar o Fim da Semana (Reporting)

DATEMOV determina o fim da semana para cada data em NEW_DATE e armazena o resultado em 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

A saída é:

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


Exemplo: Como Determinar o Fim da Semana (Maintain)

DATEMOV determina o fim da semana para daca data:

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

O resultado é:

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

Information Builders