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: