Jump to content


Photo

Problemas Com Cálculos Entre Datas


  • Faça o login para participar
2 replies to this topic

#1 Alaucho

Alaucho

    Turista

  • Usuários
  • 45 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre
  • Interesses:Desenvolver... Grande objetivo na vida...

Posted 26/12/2011, 08:23

Fala pessoal, beleza?

Gostaria de uma ajuda de vcs para um sistema que fiz, e que está apresentando um problema que não consigo identificar o que o estaria ocasionando.

É um sistema para cotação de passagem, onde um consultor envia a cotação e um responsável confirma esta cotação. O problema está nessa confirmação. A ideia é que quando o consultor envie a cotação, seja salvo no banco a data e hora do envio. Ao ser confirmada pelo responsável, pego também data e hora, e cálculo a diferença de tempo para resposta, para saber se houve quebra ou não (existe um tempo limite de resposta que define isto), e grava como "Sim" ou "Não" no banco de acordo com esse cálculo.

A questão é que algumas vezes dá certo, outras vezes não. Com algumas cotações que excedem o tempo limite, ele cálculo certo, sendo que com outras não. A princípio, o tempo calculado estaria correto, pois ele apresenta na tela a diferença correta.

Abaixo segue a função que está retornando a diferença entre as datas:
function calcula_tempo($solicitacao, $envio) {
        
        $date_time = new DateTime( $solicitacao );
        $data_atualizada = $date_time->diff( new DateTime( $envio ) );
        
        return $data_atualizada;
    }

Aqui, o código que fiz para poder verificar se houve quebra ou não. Basicamente, o tempo de quebra seria 3h 20min:
$data = calcula_tempo($monta['data_solicitacao'], $data_atual);
                    $periodo = $data->format( '%d dia(s), %H hora(s), %i minuto(s) e %s segundo(s)' );
                    $dia = (int) $data->format('%d');
                    $hora = (int) $data->format('%H');
                    $minuto = (int) $data->format('%i');
                    if ($dia > 0) {
                        $soma = (($dia * 24) + $hora) - ($dia * 15);
                        $tempo = $soma.' hora(s),'.$minuto.' minuto(s)';
                        $quebra = "Sim";
                    } else {
                        $array_data_solicitacao = explode(" ", $monta['data_solicitacao']);
                        $array_dia_solicitacao = explode("-", $array_data_solicitacao[0]);
                        
                        $array_data_envio = explode(" ", $data_atual);
                        $array_dia_envio = explode("-", $array_data_envio[0]);
                        
                        if ($array_dia_solicitacao[2] != $array_dia_envio[2]) {
                            $hora_total = $hora -  15;
                            if (($hora_total > 3) && ($minuto > 20)) {
                                $quebra = "Sim";
                            } else {
                                $quebra = "Não";
                            }
                            $tempo = $hora_total.' hora(s),'.$minuto.' minuto(s)';
                        } else {
                            $hora_total = $hora;
                            if (($hora_total > 3) && ($minuto > 20)) {
                                $quebra = "Sim";
                            } else {
                                $quebra = "Não";
                            }
                            $tempo = $hora.' hora(s),'.$minuto.' minuto(s)';
                        }
                    }   
                }
                $minutos_total = converte_hora_minuto($hora, $minuto);

Será que alguém teria alguma luz sobre o motivo disto estar ocorrendo?
Ok, eu sei que o código não está dos mais bonitos, nem dos mais funcionais. Mas, recém estava aprendendo a utilizar o "diff", essa foi a melhor forma que encontrei no momento para fazer isto.

Espero que possam me ajudar.

Abs
Um eterno apaixonado pelo meu Imortal Tricolor!!!
Programação: o começo de uma looonga jornada entre nós ^^

#2 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 28/12/2011, 11:03

Olá!

Porque você não calcula no próprio banco de dados?, dai basta montar um select trazendo o valor se estorou ou não o tempo limite.


Ex:
select TIMEDIFF('2011-12-28 17:00:00', '2011-12-28 10:00:00') as dif_hora



T+
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#3 Alaucho

Alaucho

    Turista

  • Usuários
  • 45 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre
  • Interesses:Desenvolver... Grande objetivo na vida...

Posted 30/12/2011, 11:51

E nesse caso, o campo no banco precisa estar em algum formato específico, tipo datetime por exemplo? Ou seria independente do formato?

Abs
Um eterno apaixonado pelo meu Imortal Tricolor!!!
Programação: o começo de uma looonga jornada entre nós ^^




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq