Tuesday, August 03, 2010

Oracle - SQL - DATE e TIMESTAMP datatypes



Olá,

Vamos falar rapidamente sobre os tipos de dados que armazenam data.
Aqui vamos falar de date,timestamp,timestamp with timezone e timestamp with local timezone.O tipo INTERVAL que armazena intervalo de datas já foi abordado em outro post neste blog.

date : armazena o dia,mes,ano,hora.minuto e segundos.
timestamp : armazena o dia,mes,ano,hora.minuto mais a precisão de segundos que vai de  de 0-9.O default(padrão) é 6 .

timestamp with time zone: armazena o dia,mes,ano,hora.minuto mais a precisao de segundos que vai de  de 0-9.O default(padrão) é 6 .
A diferença aqui é que é armazenado o deslocamento em relação ao UTC(Cordinated Universal Time) or Greenwich Mean Time por exemplo para a cidade de São Paulo temos "-3:00".
O deslocamento é armazenado juntamente com o dado real no banco de dados.

timestamp with local time zone : armazena o dia,mes,ano,hora.minuto mais a precisão de segundos que vai de  de 0-9.O default(padrão) é 6 .
A diferença agora para o tipo acima é que o deslocamento em relação ao UTC não é armazenado juntamente com os dados deste tipo.Funciona assim,de acordo com a configuração de
do time zone de cada sessão do usuário o Oracle mostra o valor correspondente ao que foi armazenado.


Para ficar melhor mostraremos um exemplo:

SQL> create table x_date_datatypes(id number(2),dt date,tmstp timestamp(4),tmstp_local timestamp(6) with local time zone,tmstp_wtmz timestamp(2) with time zone);

Table created.

Elapsed: 00:00:00.08

SQL> insert into x_date_datatypes
values(1,sysdate,systimestamp,systimestamp,systimestamp) ;  2

1 row created.

Elapsed: 00:00:00.03
SQL> commit;

Commit complete.

Elapsed: 00:00:00.28
SQL>

SQL>  alter session set nls_date_format ='dd/mm/rrrr hh24:mi:ss' ;

Session altered.

Elapsed: 00:00:00.03
SQL>  select * from x_date_datatypes;

 ID DT                  TMSTP                          TMSTP_LOCAL                    TMSTP_WTMZ
--- ------------------- ------------------------------ ------------------------------ ------------------------------------------------------------
  1 03/08/2010 00:44:54 03-AUG-10 12.44.54.3052 AM     03-AUG-10 12.44.54.305240 AM   03-AUG-10 12.44.54.31 AM -03:00

Elapsed: 00:00:00.00
SQL>

Como podemos ver ,a segunda coluna é do tipo date e armazena até a precisado do segundo.
Na terceira coluna o tipo é timestamp e podemos ver que está armazenando a precisão em frações de segundos com 4 posições como definido no comando CREATE TABLE.

Vamos falar sobre a quinta coluna primeiro que é do tipo timestamp with time zone.Podemos ver que ela armazena o deslocamento em relação ao UTC,que para São Paulo é -03:00.
Mesmo trocando o fuso horário da sessão/time zone o valor não é alterado,pois o deslocamento é armazenado juntamente com os dados.

Na quarta coluna que é do tipo timestamp with local timezone é armazenado como no tipo timestamp a precisão em frações de segundos.
Podemos notar no default que não aparece o deslocamento em relação ao UTC,mas se fizermos o seguinte:

SQL> alter session set time_zone='+6:00' ;

Session altered.

Elapsed: 00:00:00.00
SQL> select systimestamp from dual ;

SYSTIMESTAMP
---------------------------------------------------------------------------
03-AUG-10 01.15.20.695118 AM -03:00

Elapsed: 00:00:00.00
SQL> select * from x_date_datatypes;

 ID DT                  TMSTP                          TMSTP_LOCAL                    TMSTP_WTMZ
--- ------------------- ------------------------------ ------------------------------ ------------------------------------------------------------
  1 03/08/2010 00:44:54 03-AUG-10 12.44.54.3052 AM     03-AUG-10 09.44.54.305240 AM


Podemos ver que o valor mostrado na coluna TMSTP_LOCAL está calculado segundo a sessão do usuário descontando mais 3 horas em relação ao UTC,pois no valor armazenado no banco de dados
o UTC era -03:00

Dica :Consulte a V$TIMEZONE_NAMES 

Para mais informações sobre estes tipos de data/hora consulte aguide de SQL disponível no tahiti.oracle.com .

Abs,


JC

No comments: