Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com cálculo entre datas na mesma coluna


Tchello

Pergunta

Tenho uma tabela de alteração de status com as colunas status e data_da_alteração.

Ex.:

idcadastro status data_da_alteracao diferenca_horas

123 0 2014-07-01 09:50:00

123 1 2014-07-02 08:50:00 23:00

123 2 2014-07-03 10:00:00 24:10

123 3 2014-07-04 09:00:00 23:00

Como faço para calcular a diferença de horas entre um status e outro?

Como calculo a diferença na mesma coluna?

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Faça assim:

create table horario(
idcadastro int unsigned,
`status`int unsigned,
data_da_alteracao datetime,
diferenca_horas time);

insert into horario(idcadastro,`status`,data_da_alteracao)
values(123,0,"2014-07-01 09:50:00"),
(123,1,"2014-07-02 08:50:00"),
(123,2,"2014-07-03 10:00:00"),
(123,3,"2014-07-04 09:00:00");

call calculaDiferencaHoras;

select timediff("2014-07-02 08:50:00","2014-07-01 09:50:00");
select timediff("2014-07-03 10:00:00","2014-07-02 08:50:00");
select timediff("2014-07-04 09:00:00","2014-07-03 10:00:00");

DELIMITER $$;

DROP PROCEDURE IF EXISTS `test`.`calculaDiferencaHoras`$$

CREATE PROCEDURE `test`.`calculaDiferencaHoras` ()
BEGIN
   DECLARE msg VARCHAR(100) DEFAULT 'Calculado com sucesso';
   DECLARE idcadastro_ant INT UNSIGNED;
   DECLARE idcadastro_atual INT UNSIGNED;
   DECLARE status_ant INT UNSIGNED;
   DECLARE status_atual INT UNSIGNED;
   DECLARE dtAlteracao_ant DATETIME;
   DECLARE dtAlteracao_atual DATETIME;
   DECLARE diferenca TIME;
   DECLARE done SMALLINT UNSIGNED DEFAULT 0;
   DECLARE excessao SMALLINT UNSIGNED DEFAULT 0;
   DECLARE c_horario CURSOR FOR SELECT idcadastro,`status`,data_da_alteracao FROM horario;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excessao = 1;
   OPEN c_horario;
   FETCH c_horario INTO idcadastro_ant, status_ant, dtAlteracao_ant;
   FETCH c_horario INTO idcadastro_atual, status_atual, dtAlteracao_atual;
   WHILE done <> 1 DO
      SET diferenca = TIMEDIFF(dtAlteracao_atual, dtAlteracao_ant);
      START TRANSACTION;
      UPDATE horario
      SET diferenca_horas = diferenca
      WHERE idcadastro = idcadastro_atual AND `status` = status_atual;
      IF excessao = 1 THEN
         SET msg = "Erro na autualizacao de horario";
         ROLLBACK;
         SET done = 1;
      ELSE
         COMMIT;
      END IF;
      SET idcadastro_ant =  idcadastro_atual;
      SET status_ant = status_atual;
      SET dtAlteracao_ant = dtAlteracao_atual;
      FETCH c_horario INTO idcadastro_atual, status_atual, dtAlteracao_atual;
   END WHILE;
   CLOSE c_horario;
   SELECT msg;
END$$

DELIMITER ;$$
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...