Os tipos de dados que trabalham com datas se dividem em 2 tipos: datahora e intervalos, onde os tipos datahora armazenam datas e horários de fato e intervalos retornam os intervalos entre 2 datas.
Lembrando que sempre que for trabalhar com tipos de dados de data é bom verificar antes como está a configuração do banco de dados para estes tipos de dados, pois isso pode impactar nos resultados esperados. Para verificar como estão as configurações podemos fazer 2 consultas na tabela dummy DUAL.
select DBTIMEZONE from dual;
select SESSIONTIMEZONE from dual;
Tipo de data | Valores validos para Data | Valores validos para INTERVALOS |
---|---|---|
| -4712 até 9999 (excluindo ano 0) | Qualquer inteiro positivo ou negativo |
| 01 até 12 | 0 até 11 |
| 01 até 31 (limitado de acordo com o mês e ano) | Qualquer inteiro positivo ou negativo |
| 00 até 23 | 0 até 23 |
| 00 até 59 | 0 até 59 |
| 00 até 59.9(n), onde 9(n) é a precisão de milissegundos . A opção 9(n) não se aplica para | 0 até 59.9(n), onde 9(n) é a precisão de milissegundos |
| -12 até 14 (Esses valores consideram horários de verão) Não se aplica para | Não se aplica |
| 00 até 59. Não se aplica para | Não se aplica |
| Consulte a coluna | Não se aplica |
| Consulte a coluna | Não se aplica |
DATE
O tipo de dados DATE armazena informações de dia e hora, podemos até mesmo utilizar outros tipos de dados para armazenar datas, como um tipo de dados de caracteres por exemplo, contudo essa não é a solução mais adequada visto que para isso temos os tipos de dados de datas, em que é possível diferenciar cada parte da data como dia, mês, ano, hora, minuto e segundo. Também é possível fazer conversões de dados armazenados em colunas do tipo de data para formatos de número ou caractere através das funções TO_CHAR e TO_NUMBER, que veremos mais adiante. Utilizando essas funções é possível criar uma data a partir de um literal.
Como faço para descobrir a data atual no banco de dados? Simples, basta realizar uma consulta na tabela DUAL retornando SYSDATE.
TIMESTAMP
O Tipo TIMESTAMP funciona como o tipo DATE mas ele armazena a data, a hora e a fração de segundos, podendo ir de 0 a 9 casas para os milissegundos sendo o padrão o valor 6. Assim como é possível retornar a data do sistema, é possível retornar o valor atual de um timestamp no sistema.
TIMESTAMP WITH TIME ZONE
O tipo de dados TIMESTAMP[(frações de milissegundos)] WITH TIME ZONE funciona da mesma maneira que o tipo TIMESTAMP, porém, armazena além do timestamp o time zone, que pode estar no formato TIMEZONE REGION NAME ou TIME ZONE OFFSET. Assim como no tipo TIMESTAMP, a fração de segundos pertimitida pode variar de 0 até 9 e quando omitida na declaração da coluna o valor padrão assumido será 6.
TIMESTAMP WITH LOCAL TIME ZONE
Essa é mais uma variante do tipo TIMESTAMP, porem diferente do TIMESTAMP WITH TIME ZONE na coluna não é armazenado as informações do timestamp do banco de dados e quando é solicitado em um select é retornado de acordo com com o timezone da sessão do usuário. Este tipo de dados é bastante útil quando há uma aplicação que trabalha com diferentes timezones e deve ser exibido as datas e horários de acordo com a configuração de cada usuário. Assim como os demais tipos de dados derivados de timestamp, este também permite determinar a quantidade de casas decimais que serão armazenados para os segundos, podendo ser de 0 a 9 e caso omitido o padrão será 6. Para criar uma coluna utilizando esse tipo é necessário utilizar a seguinte sintaxe:
TIMESTAMP [(precisão de segundos)] WITH LOCAL TIME ZONE
INTERVALOS
Intervalos são tipos de dados que armazenam períodos de tempo, temos a possibilidade de armazenar valores de 2 formas: intervalos de anos e meses ou intervalos de dias e segundos. É possível utilizar intervalos como validações na cláusula WHERE de uma consulta.
INTERVAL YEAR TO MONTH
Armazena um período de tempo baseado em anos e meses, para utilizar temos a seguinte sintaxe:
INTEVAL YEAR [(precisão dos anos)] TO MONTH
Caso a precisão não seja especificada o valor padrão é 2 e deve ser um número inteiro.
Abaixo alguns exemplos.
Intervalo de 300 meses, será armazenado como 25 anos, enquanto um intervalo de 306 meses é armazenado no como 25 anos e 6 meses.
INTERVAL DAY TO SECOND
Este intervalo armazena um período de tempo que pode ser em dias, horas, minutos ou segundos, esse tipo de dados é muito útil quanto é necessário armazenar uma diferença precisa entre duas datas e horários.
Sua sintaxe é a seguinte:
INTEVAL DAY[(precisão do dia)] TO SECOND [(precisão da fração de segundos)]
Note que neste tipo de dados, podemos informar ou não tanto a precisão do dia quanto a fração de segundos. A fração de segundos, assim como nos tipos TIMESTAMP, pode ser de 0 a 9 e tem como padrão o valor 2, já a precisão dos dias aceita os mesmos valores e também tem a precisão com valor 2 como padrão.
Também é possível realizar operações entre os tipos DAY TO SECOND. Note no exemplo abaixo, que diminuindo 1 dia de 1440 minutos, o resultado é 0.