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!

6 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

    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

      Curtir

  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.

    Curtir

    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!

      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