Manipulação de Datas no Oracle – Parte 2
No post anterior sobre Oracle, vimos os conceitos básicos de manipulação e formatação de datas. Agora vamos avançar para cálculos com datas: como somar ou subtrair dias, comparar datas, encontrar a maior ou a menor data de uma lista, calcular meses entre duas datas e descobrir o próximo dia da semana.
Essas funções são muito usadas no dia a dia de quem trabalha com SQL, seja para gerar relatórios, calcular prazos ou validar períodos.
SYSDATE: a data e hora atual do servidor
A função SYSDATE retorna a data e a hora atuais do servidor onde o banco de dados Oracle está instalado. É comum usá-la a partir da tabela DUAL, uma tabela interna e vazia usada só para testes e cálculos rápidos:
SELECT SYSDATE FROM DUAL;
Para formatar a saída, use a função TO_CHAR:
SELECT TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "Agora" FROM DUAL;
Resultado:
Agora
-------------------
04-13-2016 11:45:51
Operações aritméticas com datas
O Oracle permite somar e subtrair valores diretamente de uma data. As operações possíveis são:
| Operação | O que faz |
|---|---|
data + número |
Adiciona um número de dias à data |
data - número |
Subtrai um número de dias da data |
data - data |
Calcula a diferença em dias entre duas datas |
data + número/24 |
Adiciona um número de horas à data |
Exemplo prático, comparando a data de contratação com a data atual:
SELECT HIREDATE, HIREDATE - 7, SYSDATE - HIREDATE
FROM EMP
WHERE HIREDATE LIKE '%06%';
Somando e subtraindo dias
No Oracle, o cálculo com números sempre representa dias:
SELECT SYSDATE - 2 FROM DUAL;
Isso retorna o dia anterior a ontem. Já SYSDATE + 2 retorna o dia depois de amanhã.
Como o valor somado ou subtraído representa dias, é possível trabalhar com frações para calcular horas. Basta dividir por 24. Por exemplo, para somar 6 horas a uma data:
SELECT SYSDATE + 6/24 FROM DUAL;
A única das duas operações que aceita duas datas é a subtração, que retorna a diferença em número de dias.
Somando meses a uma data com ADD_MONTHS
Para adicionar meses a uma data, use a função ADD_MONTHS:
SELECT ADD_MONTHS(SYSDATE, 2) FROM DUAL;
O primeiro parâmetro é a data e o segundo é a quantidade de meses a adicionar (pode ser negativo, para subtrair).
Atenção: se a data informada for o último dia do mês (como 31 de janeiro), o resultado também será ajustado para o último dia do mês seguinte (28 ou 29 de fevereiro).
Encontrando a maior data com GREATEST
A função GREATEST retorna a maior data entre várias informadas como parâmetro:
SELECT GREATEST(SYSDATE, SYSDATE - 2, SYSDATE + 5, SYSDATE + 15, SYSDATE - 7) FROM DUAL;
Encontrando a menor data com LEAST
Da mesma forma, a função LEAST retorna a menor data entre as opções informadas:
SELECT LEAST(SYSDATE, SYSDATE - 1, SYSDATE + 3, SYSDATE + 10, SYSDATE - 3) FROM DUAL;
Último dia do mês com LAST_DAY
A função LAST_DAY retorna o último dia do mês de uma data informada:
SELECT LAST_DAY(SYSDATE) FROM DUAL;
Muito útil para calcular vencimentos ou fechar períodos mensais em relatórios.
Quantidade de meses entre duas datas com MONTHS_BETWEEN
A função MONTHS_BETWEEN calcula quantos meses existem entre duas datas. Se o período não for um mês exato, o resultado vem com casas decimais:
SELECT MONTHS_BETWEEN(SYSDATE - 10, SYSDATE + 30) FROM DUAL;
Próximo dia da semana com NEXT_DAY
A função NEXT_DAY retorna a próxima ocorrência de um dia da semana, a partir de uma data:
SELECT NEXT_DAY(SYSDATE, 'FRI') FROM DUAL;
Nesse exemplo, o comando retorna a data da próxima sexta-feira.
Conclusão
Com essas funções (SYSDATE, ADD_MONTHS, GREATEST, LEAST, LAST_DAY, MONTHS_BETWEEN e NEXT_DAY), você já consegue montar boa parte das consultas com cálculo de datas que aparecem no dia a dia de quem trabalha com Oracle. Combine essas funções com TO_CHAR e TO_DATE para ter controle total sobre entrada e saída de datas nas suas queries.
Se você gostou, compartilhe este post e aproveite para conferir a Parte 1 da série sobre manipulação de datas no Oracle.