segunda-feira, 23 de novembro de 2009

Aritmética de Datas no Oracle

1. Introdução

Este artigo descreve a maneira pela qual podem ser realizadas operações aritméticas envolvendo campos DATE no SGBD Oracle.

2. O Tipo de Dado DATE
        

   Conforme todo desenvolvedor Oracle sabe, os campos do tipo DATE costumam ser usados em tabelas para a representação de informação referente à data e hora de algum evento. Campos do tipo DATE ocupam apenas 7 bytes e são capazes armazenar datas com a precisão na casa dos segundos; Melhor detalhando, um campo DATE é capaz de manter as seguintes informações temporais associadas a um determinado evento: século, ano, mês, dia, hora, minuto e segundo de ocorrência do evento.

 

   Para aplicações onde necessita-se manter informações de tempo com maior precisão, o Oracle disponibiliza outro tipo de dado, denominado TIMESTAMP. Este tipo representa uma extensão do tipo DATE que é capaz de gerenciar informações na ordem de fração de segundo (milissegundos, microssegundos, etc).

 

3. Aritmética de Datas
 

   O que poucos desenvolvedores Oracle sabem é que este SGBD disponibiliza uma aritmética bastante simples para a manipulação do tipo de dado DATE. É possível somar (e subtrair) constantes numéricas a uma data de maneira rápida e fácil.

 

   Em operações aritméticas envolvendo datas, o Oracle interpreta constantes numéricas como quantidade de dias. Desta forma, se você deseja obter a data do dia seguinte através de uma instrução SQL, basta fazer SYSDATE + 1:

 

SELECT SYSDATE + 1 as AMANHA FROM DUAL;

 

   De maneira análoga, se você quiser recuperar num mesmo SELECT a data corrente e também a data equivalente a data corrente mais 30 dias, basta executar a seguinte instrução:

 

SQL> SELECT SYSDATE, SYSDATE + 30 FROM DUAL;

 

SYSDATE              SYSDATE+30

--------------      -------------------

25/06/07             25/07/07



   Para obter a data da “semana passada” (data de 7 dias atrás), utilize a seguinte instrução:

 

SQL> SELECT SYSDATE, SYSDATE - 7 FROM DUAL;

 

SYSDATE                     SYSDATE - 7

--------------             -------------------

25/06/07                   18/06/07

 

3.1 Lidando com Horas, Minutos e Segundos
 

   Em muitas situações práticas poderemos estar interessados em adicionar ou subtrair não dias, mas horas, minutos ou segundos do valor de uma data. Isto também é possível no Oracle. No entanto, o SGBD solicitará com que seja especificada uma “fração de dia” adequada para a operação aritmética. Sabemos que um dia possui:

 

   -  24 horas.

   -  24 x 60 = 1440 minutos.

   -  24 x 60 x 60 = 86.400 segundos.

 

   Com isto, se desejamos somar 5 minutos a uma determinada data no Oracle, devemos somar a fração 5/1440 a esta data!  Observe este cálculo no exemplo a seguir:

 

SQL> SELECT

          TO_CHAR(SYSDATE,‘DD/MM/YYYY HH24:MI:SS’) AS AGORA,

          TO_CHAR(SYSDATE + 5/1440, ‘DD/MM/YYYY HH24:MI:SS’) AGORA_MAIS_5_MIN

          FROM DUAL;

 

AGORA                                        AGORA_MAIS_5_MIN

-------------------                   -------------------

25/06/2007 18:18:29            25/06/2007 18:23:29

 

 

   Para, por exemplo, subtrair 30 segundos, pode-se utilizar o SELECT abaixo:

 

SQL> SELECT

    TO_CHAR(SYSDATE,‘DD/MM/YYYY HH24:MI:SS’) AS AGORA,

    TO_CHAR(SYSDATE - 30/86400, ‘DD/MM/YYYY HH24:MI:SS’) TRINTA_SEG_ATRAS

    FROM DUAL;

 

AGORA                                      TRINTA_SEG_ATRAS

--------------------                ------------------

25/06/2007 18:22:42          25/06/2007 18:22:12

 

 

   Em resumo: Adicionar 1/24 significa somar uma hora a data; Adicionar 1/1440, significa adicionar um minuto; e somar 1/86400 significa somar um segundo. É importante deixar claro que a aritmética do Oracle não permite operações de multiplicação e divisão de constantes sobre datas. Apenas a soma e subtração são disponibilizadas.

 

2 comentários:

Anônimo disse...

Com Sysdate é fácil, nem precisava postar tem um monte disto na net.
Quero ver com um campo data de dentro de uma tabela.

Unknown disse...

Ótima explicação. Muito obrigado e parabéns!

Postar um comentário