Ir ao conteúdo
  • Cadastre-se

Como inserir dados do tipo data e tempo?


Posts recomendados

Criei minha table e tentei assim, mas da erro na hora de inserir, vejam a imagem do erro lá embaixo;

CREATE TABLE Ocorrencia (
id_ocorrencia int(11) NOT NULL PRIMARY KEY,
-- data_hora datetime,
data_ocorrencia datetime ,
data_termino datetime,
tempo_duracao datetime
);
drop table ocorrencia;
CREATE TRIGGER trg_duracao BEFORE INSERT
ON Ocorrencia 
FOR EACH ROW 
SET NEW.tempo_duracao = (NEW.data_ocorrencia - data_termino);
    
INSERT INTO ocorrencia
(id_ocorrencia, data_ocorrencia, data_termino)
VALUES
('01','2017-05-25 08:30:05','2017-05-26 00:20:10');

 

Screenshot 2017-05-25 20.32.56.png

Link para o comentário
Compartilhar em outros sites

@DoodohRafael Testei aqui no meu phpMyAdmin e realmente não consegui fazer funcionar da forma como você colocou.

 

- Uma dúvida: porque tem um "drop table ocorrencia;" antes de criar a trigger?

- Teste colocar o prefixo "NEW." antes de data_termino em sua trigger. Fiz aqui e não deu certo (minha teoria do porque abaixo)

 

Acho que não é possível fazer por meio de trigger, provavelmente esse erro unknown column "data_termino" in field list é por conta de não poder referenciar a mesma tabela na trigger que a chamou.

 

O que eu fiz foi por meio de procedure:

 

CREATE TABLE `ocorrencia` (
 `id_ocorrencia` int(11) NOT NULL,
 `data_ocorrencia` datetime DEFAULT NULL,
 `data_termino` datetime DEFAULT NULL,
 `tempo_duracao` time DEFAULT NULL,
 PRIMARY KEY (`id_ocorrencia`)
) 
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_duracao`(IN `id` INT(11), IN `inicio` DATETIME, IN `fim` DATETIME)
   NO SQL

begin

	insert into ocorrencia (id_ocorrencia, data_ocorrencia, data_termino, tempo_duracao)
	values
	(id, inicio, fim, (TIMEDIFF(fim, inicio)));
            
end
call sp_duracao(12, '2017-05-20 08:20:30', '2017-05-22 09:30:40')

 

Desse jeito consegui colocar a diferença entre as datas em formato TIME, não sei por qual motivo não consigo mostrar a diferença em DATETIME, se alguém souber...

 

Pode ser feito diretamente no insert também (apenas usando a função TIMEDIFF).

 

Enfim, veja se isso lhe ajuda no seu problema.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Continuo achando que não é possível fazer por meio de trigger na mesma tabela que chamou essa trigger.

 

testei um outro jeito aqui, dessa vez com trigger, mas inserindo o calculo de diferença em outra tabela.

 

veja: 

 

TABELAS:

CREATE TABLE `ocorrencia` (
 `id_ocorrencia` int(11) NOT NULL,
 `data_ocorrencia` datetime DEFAULT NULL,
 `data_termino` datetime DEFAULT NULL,
 PRIMARY KEY (`id_ocorrencia`)
) 
CREATE TABLE `tempo_total` (
 `codigo_ocorrencia` int(11) NOT NULL,
 `tempo_duracao` datetime DEFAULT NULL
) 

TRIGGER

CREATE DEFINER=`root`@`localhost` TRIGGER `trigger_tempo` AFTER INSERT ON `ocorrencia` FOR EACH ROW begin

declare tempo_calculo DATETIME;


SELECT
   Concat(Ano, '-', Mes, '-', Dia, ' ', Hora, ':', Minuto, ':', Segundo) AS Data_calculo into tempo_calculo
FROM (
   SELECT
       TIMESTAMPDIFF(YEAR, data_ocorrencia, data_termino) AS Ano,
       TIMESTAMPDIFF(MONTH, data_ocorrencia + INTERVAL TIMESTAMPDIFF(YEAR, data_ocorrencia, data_termino) YEAR , data_termino) AS Mes,
       TIMESTAMPDIFF(DAY, data_ocorrencia + INTERVAL TIMESTAMPDIFF(MONTH, data_ocorrencia, data_termino) MONTH , data_termino) AS Dia,
       TIMESTAMPDIFF(HOUR, data_ocorrencia + INTERVAL TIMESTAMPDIFF(DAY, data_ocorrencia, data_termino) DAY , data_termino) AS Hora,
       TIMESTAMPDIFF(MINUTE, data_ocorrencia + INTERVAL TIMESTAMPDIFF(HOUR, data_ocorrencia, data_termino) HOUR , data_termino) AS Minuto,
       TIMESTAMPDIFF(SECOND, data_ocorrencia + INTERVAL TIMESTAMPDIFF(MINUTE, data_ocorrencia, data_termino) MINUTE , data_termino) AS Segundo
   FROM ocorrencia where ocorrencia.id_ocorrencia = NEW.id_ocorrencia
   ) AS T;
   
   
INSERT INTO tempo_total (codigo_ocorrencia, tempo_duracao)
   values
       (NEW.id_ocorrencia, tempo_calculo); 

end

INSERT:

 

INSERT INTO ocorrencia (id_ocorrencia, data_ocorrencia, data_termino)
	values 
	(88, '2016-04-03 08:50:50', '2017-05-22 09:40:20');

Resultado na imagem em anexo.

 

PS: esqueci de mencionar, você pode fazer o relacionamento das duas tabelas pelo campo id_ocorrencia (tabela - ocorrencia) e codigo_ocorrencia (tabela - tempo_total) por meio de chave estrangeira.

 

print.jpg

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@DoodohRafael o que você precisa fazer com esse banco?

As datas precisam ser completas? Usando DATETIME (ano, mes, dia, hora, minuto e segundo - precisa de tudo isso?)

 

Você pode tentar da forma como eu falei antes - usando apenas um insert e a função TIMEDIFF().

 

Ficaria assim:

create table ocorrencia(
    id_ocorrencia INT NOT NULL,
    data_ocorrencia DATETIME,
    data_termino DATETIME,
    tempo_duracao TIME,
    primary key (id_ocorrencia)
    );
insert into ocorrencia 
    (id_ocorrencia, data_ocorrencia, data_termino, tempo_duracao) 
    values
    (47, '2017-05-11 08:50:20', '2017-05-12 09:50:20', TIMEDIFF('2017-05-12 09:50:20', '2017-05-11 08:50:20'));

Desse jeito a conta (tempo_duracao) retorna a diferença no formato TIME - hora:minuto:segundo...

 

 

 

Link para o comentário
Compartilhar em outros sites

esse erro que está aparecendo :

17 horas atrás, DoodohRafael disse:

Cara, valeu mesmo, mas você não poderia me mostrar uma maneira mais simples? Sem todos esses códigos? O do print ta errado?

adicionado 34 minutos depois

E mesmo assim deu erro, será que é meu pc?

 

Screenshot 2017-05-31 16.11.34.png

 

é porque você está tentando criar uma tabela que já foi criada (tabela tempo_total). tenta rodar os comandos sql separados (primeiro um create table, depois o outro create table, depois a trigger e por último um insert para testar o funcionamento da trigger). 

 

Se ainda sim der erro, pode ser que a sintaxe seja um pouco diferente no Mysql Workbench - não sei dizer, nunca usei ele - nesse caso tente pelo jeito sem trigger, direto no insert:

17 horas atrás, Attilio Galzerano disse:

@DoodohRafael o que você precisa fazer com esse banco?

As datas precisam ser completas? Usando DATETIME (ano, mes, dia, hora, minuto e segundo - precisa de tudo isso?)

 

Você pode tentar da forma como eu falei antes - usando apenas um insert e a função TIMEDIFF().

 

Ficaria assim:


create table ocorrencia(
    id_ocorrencia INT NOT NULL,
    data_ocorrencia DATETIME,
    data_termino DATETIME,
    tempo_duracao TIME,
    primary key (id_ocorrencia)
    );

insert into ocorrencia 
    (id_ocorrencia, data_ocorrencia, data_termino, tempo_duracao) 
    values
    (47, '2017-05-11 08:50:20', '2017-05-12 09:50:20', TIMEDIFF('2017-05-12 09:50:20', '2017-05-11 08:50:20'));

Desse jeito a conta (tempo_duracao) retorna a diferença no formato TIME - hora:minuto:segundo...

 

 

 

:

 

 

Link para o comentário
Compartilhar em outros sites

faça então assim: crie outra tabela para armazenar apenas o id da ocorrencia e o tempo_duração (ligando por chave estrangeira com a tabela principal de calamidades), crie a trigger para realizar o cálculo do tempo e inserir o resultado nessa tabela nova.

 

TABELAS:

Create table ocorrencia (
	id_ocorrencia INT NOT NULL AUTO_INCREMENT,
	data_ocorrencia DATETIME NOT NULL,
	data_termino DATETIME NOT NULL
	primary key(id_ocorrencia)
	);


Create table tempo_total (
	codigo_ocorrencia INT NOT NULL,
	tempo_duracao TIME
);


ALTER TABLE tempo_total ADD CONSTRAINT fk_ocorrencia FOREIGN KEY (codigo_ocorrencia) REFERENCES ocorrencia(id_ocorrencia);

 

 

TRIGGER:

delimiter //

CREATE DEFINER=`root`@`localhost` TRIGGER `trigger_tempo` AFTER INSERT ON `ocorrencia` 
FOR EACH ROW 

begin
   insert into tempo_total
       (codigo_ocorrencia, tempo_duracao)
       values
       (NEW.id_ocorrencia, TIMEDIFF(NEW.data_termino, NEW.data_ocorrencia));        
end;//

delimiter;

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 2017-6-2 às 09:12, Attilio Galzerano disse:

faça então assim: crie outra tabela para armazenar apenas o id da ocorrencia e o tempo_duração (ligando por chave estrangeira com a tabela principal de calamidades), crie a trigger para realizar o cálculo do tempo e inserir o resultado nessa tabela nova.

 

TABELAS:


Create table ocorrencia (
	id_ocorrencia INT NOT NULL AUTO_INCREMENT,
	data_ocorrencia DATETIME NOT NULL,
	data_termino DATETIME NOT NULL
	primary key(id_ocorrencia)
	);


Create table tempo_total (
	codigo_ocorrencia INT NOT NULL,
	tempo_duracao TIME
);


ALTER TABLE tempo_total ADD CONSTRAINT fk_ocorrencia FOREIGN KEY (codigo_ocorrencia) REFERENCES ocorrencia(id_ocorrencia);

 

 

TRIGGER:


delimiter //

CREATE DEFINER=`root`@`localhost` TRIGGER `trigger_tempo` AFTER INSERT ON `ocorrencia` 
FOR EACH ROW 

begin
   insert into tempo_total
       (codigo_ocorrencia, tempo_duracao)
       values
       (NEW.id_ocorrencia, TIMEDIFF(NEW.data_termino, NEW.data_ocorrencia));        
end;//

delimiter;

 

Aee mano funcionou, valeu mesmo velho; Só mais um help, to pedindo tanta ajuda porque o professor só da uma tese mesmo do que é e manda a gente sair perguntando, pesquisando tlg? Queria colocar um before insert com a mensagem "voce nao pode insertir sem informar o nome, pois é obrigatório"?

Link para o comentário
Compartilhar em outros sites

isso já não sei se tem como, precisaria pesquisar mais afundo para verificar a possibilidade. Mas é necessário uma trigger para validar o insert?

 

Achei um link que parece interessante, veja se te ajuda.

 

http://cvuorinen.net/2013/05/validating-data-with-triggers-in-mysql/

Link para o comentário
Compartilhar em outros sites

Consegui fazer na base daquele ajuste técnico - Gambiarra 

 

Trigger para validar o insert:

delimiter//

CREATE DEFINER=`root`@`localhost` TRIGGER `trigger_validar_insert` BEFORE INSERT ON `ocorrencia` 
FOR EACH ROW 

begin

IF NEW.data_ocorrencia IS NULL
   THEN
       CALL `'O campo "data_ocorrencia" deve ser preenchido'`;
       END IF;

end;//

delimiter;

Em anexo tem o insert (sem data_ocorrencia) e o erro acima. Apenas ajuste conforme o campo que se fizer necessário o preenchimento.

 

Se o seu Mysql Workbench suportar você pode tentar por meio do comando SIGNAL.

insert.jpg

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...