Diferença entre duas datas no SAS (em dias, meses ou anos)

Calcular a diferença entre duas datas no SAS é simples, basta subtrair uma data pela outra. Porém, se você quiser fazer a diferença em meses, anos, semanas ou alguma unidade do tipo, há duas escolhas: (1) realizar a subtração e depois dividir o valor pelo número de dias correspondentes ao período (ex.: dividir por 30 no caso de mês) ou (2) utilizar a função intck(). É desta segunda que vou falar neste post.

A sintaxe do intck() é bem simples e intuitiva, basta inserir as datas cujo intervalo será calculado e de que maneira você quer a saída (em dias, meses, anos, semanas):

data tabela_saida;
    set tabela_entrada;
    diferenca_das_datas = intck('periodo',data_mais_antiga, data_mais_atual);
run;

Ok, talvez a escolha dos nomes das variáveis não deixe tudo tão óbvio, mas você vai ver que não é difícil. Vamos ver como funciona isso na prática. Primeiro, criamos uma tabela qualquer para ser usada de exemplo:

data tabela_exemplo;
    input id $ data_1 date9. id2 $ data_2 date9.;
    format data_1 date9. data_2 date9.;
    datalines;
AA 01jan2000 AA 05mar2000
BB 02feb2005 BB 10apr2006
CC 10aug1990 CC 05jan1995
DD 11dec1999 DD 21dec1999
;
run;

Captura de Tela 2018-10-27 às 09.33.34

Sim, tem uma bizarrice de dois campos id. Como eu disse na descrição do site, também estou aprendendo, e neste aprendizado vi que ao retirar esta coluna id2, minha coluna data_2 veio missing. Se alguém um dia descobrir o motivo, me avisem. Enfim, continuando com o exemplo, vamos calcular a quantidade de anos entre as duas datas:

data tabela_exemplo_anos;
    set tabela_exemplo;
    dif_anos = intck('year', data_mais_antiga, data_mais_atual);
run;

Captura de Tela 2018-10-27 às 09.41.01

Veja que a diferença não chega a um ano no primeiro caso, portanto temos 0 como retorno. Podemos calcular a diferença de trimestres, meses, semanas ou dias úteis:

data tabela_exemplo_variados;
    set tabela_exemplo;
    dif_mes = intck('month', data_1, data_2);
    dif_tri = intck('qtr', data_1, data_2);
    dif_semana = intck('week', data_1, data_2);
    dif_dia_util = intck('weekday', data_1, data_2);
    dif_dia = intck('day', data_1, data_2);
run;

Captura de Tela 2018-10-27 às 09.33.59

Agora, peguemos um caso mais atípico e que possa causar confusão. Imagine que a data inicial seja 30 de janeiro de 2019 e a data final seja 5 de fevereiro de 2019. A diferença entre as duas datas não é de 30/31 dias. Como funciona a diferença em meses para essas datas?

Neste caso, há três possibilidades: usar a função da mesma forma que foi especificada no exemplo acima, usar a função declarando também um terceiro argumento “c” (contínuo) ou usar a função declarando um terceiro argumento “d” (discreto). Veja o resultado de cada uma das três opções:

data exemplo_mes;
    dif_mes_padrao = intck('month', '30jan2019'd,'05feb2019'd);
    dif_mes_c = intck('month', '30jan2019'd,'05feb2019'd,"c");
    dif_mes_d = intck('month', '30jan2019'd,'05feb2019'd,"d");
run;

Captura de Tela 2018-10-27 às 09.37.35

Note que tivemos os resultados 1, 0 e 1 respectivamente. Ou seja, quando utilizamos o argumento “c”, estamos tratando do mês completo, não somente do fato das duas datas pertencerem a meses diferentes. Um exercício interessante é trocar 5 de fevereiro por 27 e 28. Você vai notar que para 27, o retorno com o argumento “c” ainda será 0. Porém, para 28, será 1.

intck() é uma função fácil de se aplicar, bem intuitiva e muito melhor do que ficar calculando a diferença de dias e dividindo por 30 – o último exemplo utilizado aqui mostra isso claramente. Creio que possa ser útil, pois data é um dos maiores empecilhos para qualquer um trabalhando com SAS.

Ficamos por aqui! Dúvidas, críticas ou sugestões é só mandar um comentário ou uma mensagem no formulário que está em Sobre o Estatsite. Siga o EstatSite no Twitter para algumas dicas mais rápidas -> @EstatSite

Abraços e bons estudos!

Anúncios

2 comentários

  1. Bom dia, tudo bem?

    Estou com uma dúvida…
    Preciso contar a diferente entre duas datas considerando os dias úteis.
    No meu caso específico, sábado também é considerado dia útil, vocês conhecem alguma forma de realizar tal código?

    Muto obrigado pela atenção,
    abraços!

    Curtir

    1. Fala Pedro!
      Nossa, mil desculpas pela demora em responder. Não tinha visto (não sei se o app não alertou ou se alertou junto com outro comentário e eu só respondi o outro e esqueci este).
      Mas o que você precisa é indicar o dia que você quer como não útil, tente:

      data dias_uteis;
      set tabela_exemplo;
      wkdays=intck(‘WEEKDAY1W’,data_1,data_2);
      run;

      Para segunda, você poderia fazer WEEKDAY2W e por aí vai.
      Veja se funciona – imagino que você nem precise mais disso, peço desculpas de novo.
      Confesso que não conhecia este parâmetro até você perguntar, acabei aprendendo junto.

      Abs!

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s