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;

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;

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;

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;

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.

Gostou do conteúdo? Se inscreva para receber as novidades! Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e compartilhar com seus amigos. De verdade, isso faz toda a diferença. Você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @EstatSite ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal do Yukio.

Bons estudos!

8 comentários em “Diferença entre duas datas no SAS (em dias, meses ou anos)”

  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!

    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!

    1. Oi Juliana,
      Vixi, agora voce me pegou, viu? hahaha
      Olha, para excluir fim de semana da analise, use o intck combinado com weekdays, ficaria algo como: diferenca_entre_datas = intck(‘WEEKDAY’, data_inicio, data_fim).
      Para lidar com feriados ja fica mais complicado. Eu acho que precisaria declarar os feriados que você quer considerar e usar de algum jeito na função (creio que nao tenha os feriados brasileiros no SAS). Vou tentar resolver esta questao e volto aqui nos proximos dias com a solucao.
      Abracos

  2. OI Yukio, trabalho com análise de sobrevivência, e gostaria de te perguntar como calculo a diferença entre duas datas que estão na mesma coluna:
    Tenho um banco do tipo “long”, ou seja a cada exame que o paciente faz é criado uma nova linha, coloco as datas em ordem crescente por paciente e preciso saber o intervalo de tempo entre um exame e o próximo..
    Desde já agradeço muito sua colaboração.

    1. Oi Cassia, desculpe a demora!
      Entao, como assim na mesma coluna? Tipo, tem uma data na linha 1, outra na linha 2, e assim por diante e voce quer a diferenca de uma e outra? Porque se for assim voce pode usar a funcao lag(), algo como coluna_nova = coluna_x – lag(coluna_x), sendo coluna_nova a coluna que voce vai criar e coluna_x a coluna de onde saem as datas.
      Veja se é isso que voce quer, se nao for, pode deixar um outro comentario, ou e-mail, ou uma DM no twitter que descobrimos isso juntos.
      Abracos e desculpa pela demora mais uma vez!

  3. Bom dia, tudo bem?
    Realizei um experimento com 6 tratamentos e fiz uma análise que me da a resposta sim ou não, dessa forma gostaria de saber se tem algum proc para analise qualitativa. Não consigo encontrar em lugar nenhum. Obrigado

    1. Cara, não sei se entendi. Não quer me chamar na DM? No Twitter é @unidosdados, no Insta é @universidadedosdados. Vamos trocar uma ideia que eu tento te ajudar 🙂

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *