Friday, February 12, 2010

SQL - INTERVAL YEAR TO MONTH e DAY TO SECOND Datatypes

A precisão máxima deste datatype são de 2 digitos para ano e 2 para mês.

Poderiamos usar por exemplo para armazenar vigências de determinado garantia por exemplo.
Comprei um aparelho de barbear e a garantia dele é de por exemplo 1 ano de 6 meses.Uma "super garantia" .

Login:

[oracle@marte ~]$ ps -ef|grep pmon
oracle    2997     1  0 08:03 ?        00:00:01 asm_pmon_+ASM
oracle    3115     1  0 08:05 ?        00:00:01 ora_pmon_dbpost
oracle    5943  5892  0 11:51 pts/1    00:00:00 grep pmon
[oracle@marte ~]$ sqlplus dbajcc@dbpost

SQL*Plus: Release 11.2.0.1.0 Production on Fri Feb 12 11:51:26 2010

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

dbajcc@DBPOST on 12-FEB-10 >

Criando a tabela :

dbajcc@DBPOST on 12-FEB-10 >create table super_shavers
  2  (name varchar2(30),warranty interval year to month );

Table created.

Elapsed: 00:00:00.08
dbajcc@DBPOST on 12-FEB-10 >

Inserindo dados na tabela super_shavers :

dbajcc@DBPOST on 12-FEB-10 >insert into super_shavers
  2  values
  3  ('shaver_100',to_yminterval('01-06')) ;

1 row created.

Elapsed: 00:00:00.02
dbajcc@DBPOST on 12-FEB-10 >
dbajcc@DBPOST on 12-FEB-10 >insert into super_shavers
  2  values
  3  ('shaver_200',to_yminterval('01-00')) ;

1 row created.

Elapsed: 00:00:00.01
dbajcc@DBPOST on 12-FEB-10 >commit ;

Commit complete.

Elapsed: 00:00:00.00
dbajcc@DBPOST on 12-FEB-10 >


Bom, comprei o barbeador hoje e quero ver até que data eu posso levar na assistência tecnica caso aconteça algum defeito de fabrica.

dbajcc@DBPOST on 12-FEB-10 >select sysdate + warranty as "Expiration Date",
  2  name as "Product Name"
  3  from super_shavers
  4  where  name ='shaver_100' ;

Expiratio Product Name
--------- ------------------------------
12-AUG-11 shaver_100

1 row selected.

Elapsed: 00:00:00.01
dbajcc@DBPOST on 12-FEB-10 >



Há também o datatype INTERVAL DAY TO SECOND que coloca ainda mais precisão  para dia,hora,minutos e segundos.

Criando a tabela de exemplo :

dbajcc@DBPOST on 12-FEB-10 >create table login_expiration
  2  (login_name varchar2(50),
  3
dbajcc@DBPOST on 12-FEB-10 >create table fool_login
  2  (login_name varchar2(30),expiration_dt interval day to second);

Table created.

Elapsed: 00:00:00.07
dbajcc@DBPOST on 12-FEB-10 >

Inserindo linhas :

dbajcc@DBPOST on 12-FEB-10 >
dbajcc@DBPOST on 12-FEB-10 >insert into fool_login
  2  values
  3  ('rmartin',INTERVAL '30 5:00:06' DAY TO SECOND) ;

1 row created.

Elapsed: 00:00:00.03
dbajcc@DBPOST on 12-FEB-10 >
dbajcc@DBPOST on 12-FEB-10 >insert into fool_login
  2  values
  3  ('jccorrea',INTERVAL '75' DAY) ;

1 row created.

Elapsed: 00:00:00.00
dbajcc@DBPOST on 12-FEB-10 >commit ;

Commit complete.

Elapsed: 00:00:00.02
dbajcc@DBPOST on 12-FEB-10 >

Na minha tabela de exemplo vou verificar quanto tempo estes usuários/logins que foram criados hoje/agora possuem até serem bloqueados para entrar em um determinado sistema
Obs. * a tabela foi criada apenas para exemplo *

dbajcc@DBPOST on 12-FEB-10 >
dbajcc@DBPOST on 12-FEB-10 >alter session set nls_date_format = 'dd/mm/rrrr hh24:mi' ;

Session altered.

Elapsed: 00:00:00.01
dbajcc@DBPOST on 12/02/2010 12:42 >select login_name,sysdate + expiration_dt
  2  from fool_login
  3  ;

LOGIN_NAME                     SYSDATE+EXPIRATI
------------------------------ ----------------
rmartin                        14/03/2010 17:43
jccorrea                       28/04/2010 12:43

2 rows selected.

Elapsed: 00:00:00.01
dbajcc@DBPOST on 12/02/2010 12:43 >

Esta foi uma breve apresentação dos datatypes INTERVAL YEAR TO MONTH e DAY TO SECOND e duas funções para manipulá - los TO_YMINTERVAL(expressão' ) e INTERVAL 'expressão' .

Estes datatypes estão disponíveis no Oracle Database a partir da versão 9i .

Até,

Júlio César











No comments: