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.
DATEMOV(date, 'move-point')
onde:
Data
É a data a ser movida. É necessário ser uma data de formato com todos os componentes (por exemplo, MDYY ou YYJUL).
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:
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.
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
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
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
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 |