Translate

domingo, 24 de abril de 2016

Banco Oracle - Adicionando valores de tempo em Datas TIMESTAMP


Neste post procurarei utilizar exemplos de como inserir valores de datas, (campos TIMESTAMP) incrementando, minutos, segundos, etc, a partir da data atual.

Para começar, vamos criar uma tabela de exemplo, com campo identificador (ID_TESTE) dois campos (DATA1 e DATA2) representando as datas atuais e a data acrescida respectivamente.

Há também a criação (opcional) de uma sequence (TESTE_COM_DATA_SEQ) para facilitar a inserção de valores únicos o campo ID_TESTE.

--criação da tabela de testes
CREATE TABLE TESTES_COM_DATA(

ID_TESTE          INTEGER,
DATA1             TIMESTAMP(6),
DATA2             TIMESTAMP(6),

PRIMARY KEY (ID_TESTE)

);

--criação de sequence (opcional) para atribuição de 
--valores do campo ID_TESTE
CREATE SEQUENCE TESTES_COM_DATA_SEQ
  MINVALUE 1
  START WITH 1
  INCREMENT BY 1
  CACHE 20;


Para começarmos, temos que alterar o formato de exibição de TIMESTAMP para a sessão atual do usuário. Esta alteração não é permanente e é cancelada quando encerramos a sessão.

Observação: Sempre que formos utilizar este tipo de tratativas com datas, temos que utilizar o comando abaixo:

--necessario alterar a sessao, utilizo aqui o formato 'DD/MM/YYYY HH24:MI:SS'
       ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

Feito isso, vamos estudar os códigos para incremento dos valores de Horas, Minutos e Segundos




 --TIMESTAMP ADICIONADO HORAS
        SELECT SYSTIMESTAMP AS DATA_ATUAL
                            , TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              2 --QUANTIDADE DE HORAS ADICIONADAS
                              /24)
                              , 'DD/MM/YYYY HH24:MI:SS') 
                              AS DATA_SOMADA_HORAS
                            FROM DUAL;      
      
       --TIMESTAMP ADICIONADO MINUTOS
       SELECT SYSTIMESTAMP AS DATA_ATUAL
                            , TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              5 --QUANTIDADE DE MINUTOS ADICIONADOS
                              /(24*60))
                              , 'DD/MM/YYYY HH24:MI:SS') 
                              AS DATA_SOMADA_MINUTOS
                            FROM DUAL;
                            
       --TIMESTAMP ADICIONADO SEGUNDOS
        SELECT SYSTIMESTAMP AS DATA_ATUAL
                            , TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              25 --QUANTIDADE DE SEGUNDOS ADICIONADOS
                              /24/60/60)
                              , 'DD/MM/YYYY HH24:MI:SS') 
                              AS DATA_SOMADA_SEGUNDOS
                            FROM DUAL;  


Finalmente, podemos aplicar os conceitos aprendidos dentro de cláusulas de INSERT na tabela do banco:
--inserindo diferença de duas horas
INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                       SYSTIMESTAMP + (
                       2 --QUANTIDADE DE HORAS ADICIONADAS
                       /24)
                       , 'DD/MM/YYYY HH24:MI:SS') 
                       )  --inserção de SYSTIMESTAMP + 2 Horas        
        );


--inserindo diferença de quinze minutos
INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                       SYSTIMESTAMP + (
                       15 --QUANTIDADE DE MINUTOS ADICIONADOS
                        /(24*60))
                      , 'DD/MM/YYYY HH24:MI:SS')--inserção de SYSTIMESTAMP + 15 mins        
          )
        );


        INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                       SYSTIMESTAMP + (
                       30 --QUANTIDADE DE SEGUNDOS ADICIONADOS
                       /24/60/60)
                       , 'DD/MM/YYYY HH24:MI:SS')--inserção de SYSTIMESTAMP + 30 segs        
          )
        );   

Resultado final das linhas inseridas:




Podemos também adicionar simultaneamente HORAS/MINUTOS/SEGUNDOS à data atual, como no exemplo abaixo:

      --inserindo diferenca de HORAS/MINUTOS/SEGUNDOS
        INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              2 --QUANTIDADE DE HORAS ADICIONADAS
                              /24)
                               +(
                              10 --QUANTIDADE DE MINUTOS ADICIONADOS
                              /(24*60))
                              +
                              (
                              30 --QUANTIDADE DE SEGUNDOS ADICIONADOS
                              /24/60/60)   --inserção de SYSTIMESTAMP + 30 segundos        
             )
          )
        );   

Resultando em:




Nenhum comentário:

Postar um comentário